Cycle Finder Herramienta

Uso

Este es un ejemplo sencillo con un ciclo entre dos clases, Foo y 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.

En el resultado, primero verás acceptAST para cada archivo Java que se analice. Esto es solo registro informativo.

Para cada ciclo, se imprimirán dos listas. La primera lista contiene una descripción del ciclo. Cada línea incluye una arista en el gráfico de referencia. La descripción de la conexión mostrará el tipo de origen seguido de una descripción de cómo el tipo de origen podría referirse al tipo de destino.

La segunda lista, en Full Types, muestra las claves de tipo único para cada tipo en el ciclo. Esto es útil, ya que proporciona el paquete completo de cada tipo.

Suprimir listas

Algunos ciclos detectados no requerirán ninguna medida correctiva. Esto puede deberse a que el ciclo contiene objetos de larga duración que no necesitan desasignarse. O la herramienta puede detectar un ciclo teórico basado en los tipos de ciertos campos donde se puede comprobar que los objetos involucrados nunca formarán un ciclo. En estos casos, podemos usar archivos de listas de eliminación para no informar estos ciclos.

La herramienta acepta archivos de listas de eliminación con la opción --suppress-list. Los archivos de lista de supresión son archivos de texto sin formato que contienen entradas de una línea. Una entrada de la lista de eliminación puede adoptar una de las 4 formas que se muestran en el siguiente ejemplo. Se recomienda que, cuando agregues entradas de listas de eliminación, sea lo más específico posible, para evitar suprimir un ciclo legítimo. Los comentarios se pueden agregar con el carácter "#".

# 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