Cycle Finder Narzędzie

Wykorzystanie

Oto prosty przykład przedstawiający cykl między 2 klasami: Foo i 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.

W danych wyjściowych zobaczysz najpierw tekst acceptAST dla każdego analizowanego pliku Java. Te informacje mają charakter informacyjny.

W każdym cyklu zostaną wydrukowane dwie listy. Pierwsza lista zawiera opis cyklu. Każda linia przedstawia krawędź na wykresie referencyjnym. Opis krawędzi zawiera typ punktu początkowego i opis, w jaki sposób typ źródła może odnosić się do typu celu.

Druga lista, w sekcji Full Types, zawiera unikalne klucze typu dla każdego typu w cyklu. Jest to przydatne, ponieważ zapewnia pełny pakiet każdego typu.

Ukryj listy

Niektóre wykryte cykle nie wymagają żadnych działań naprawczych. Przyczyną może być to, że cykl zawiera obiekty o długotrwałym czasie, których nie trzeba usuwać. Albo może wykryć cykl teoretyczny na podstawie rodzajów określonych pól, w których jest dowodem na to, że zaangażowane obiekty nigdy nie utworzą cyklu. W takich przypadkach możemy użyć plików listy pomijania, by nie zgłaszać tych cykli.

Narzędzie akceptuje pliki z listą pomijania za pomocą opcji --suppress-list. Pliki listy pomijanych to zwykłe pliki tekstowe zawierające wpisy jednowierszowe. Wpis na liście pomijanej może mieć jedną z 4 postaci pokazanych w poniższym przykładzie. Zalecamy, aby podczas dodawania wpisów do listy pomijania podać jak najbardziej szczegółowe informacje, aby uniknąć pomijania prawidłowego cyklu. Komentarze można dodawać, używając znaku „#”.

# 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