Cycle Finder Strumento

Utilizzo

Ecco un semplice esempio con un ciclo tra due classi, Foo e Bar.

cat Foo.java
package mypkg;
public class Foo {
  Bar myBar;
}

cat Bar.java
package mypkg;
public class Bar {
  Foo myFoo;
}

cycle_finder Foo.java Bar.java
acceptAST: mypkg/Bar.java
acceptAST: mypkg/Foo.java

***** Found reference cycle *****
Bar -> (field myFoo with type Foo)
Foo -> (field myBar with type Bar)
----- Full Types -----
Lmypkg/Bar;
Lmypkg/Foo;

1 CYCLES FOUND.

Nell'output vedrai per la prima volta acceptAST per ogni file Java analizzato. Questo è solo un logging informativo.

Per ogni ciclo vengono stampati due elenchi. Il primo elenco contiene una descrizione del ciclo. Ogni linea elenca un bordo nel grafico di riferimento. La descrizione del bordo mostrerà il tipo di origine seguito da una descrizione di come il tipo di origine potrebbe fare riferimento al tipo di destinazione.

Il secondo elenco, sotto Full Types, mostra le chiavi di tipo univoche per ciascun tipo nel ciclo. È utile in quanto fornisce il pacchetto completo di ogni tipo.

Elimina elenchi

Alcuni cicli rilevati non richiedono azioni correttive. Il motivo potrebbe essere che il ciclo contiene oggetti di lunga durata che non devono essere collocati. In alternativa, lo strumento può rilevare un ciclo teorico in base ai tipi di determinati campi in cui è dimostrabile che gli oggetti coinvolti non formeranno mai un ciclo. In questi casi, possiamo utilizzare i file suppress-list per non segnalare questi cicli.

Lo strumento accetta i file dell'elenco nascosto utilizzando l'opzione --suppress-list. I file degli elenchi di esclusione sono file di testo normale contenenti voci di una riga. Una voce dell'elenco eliminato può assumere una delle quattro forme illustrate nell'esempio seguente. Quando aggiungi voci dell'elenco suppress, consigliamo di essere il più specifici possibile per evitare di sopprimere un ciclo legittimo. I commenti possono essere aggiunti utilizzando il carattere "#".

# Specifies that "fieldA" in ClassA will not refer to any object that is a subtype of ClassB.
FIELD my.pkg.ClassA.fieldA my.pkg.ClassB

# Suppresses all cycles containing "fieldA" in ClassA.
FIELD my.pkg.ClassA.fieldA

# Suppresses all cycles containing any field of ClassA.
TYPE my.pkg.ClassA

# Suppress all cycles containing the Inner's outer reference to ClassA.
OUTER my.pkg.ClassA.Inner

# Suppress all cycles containing the outer reference from an anonymous class declared in myMethod.
OUTER my.pkg.ClassA.myMethod.$

# Suppresses all cycles containing any type in package "my.pkg".
NAMESPACE my.pkg