Cycle Finder Araç

Kullanım

Burada, Foo ve Bar adlı iki sınıf arasındaki döngüyü gösteren basit bir örnek verilmiştir.

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.

Çıkışta, ilk olarak ayrıştırılan her Java dosyası için acceptAST değerini görürsünüz. Bu işlem yalnızca bilgilendirme amaçlıdır.

Her döngü için iki liste yazdırılır. İlk listede, döngünün bir açıklaması bulunur. Her çizgi referans grafiğinde bir kenar gösterir. Kenar açıklamasında kaynak türü ve kaynak türünün hedef türünü nasıl ifade edebileceğine dair açıklama yer alır.

Full Types altındaki ikinci listede, döngüdeki her tür için benzersiz tür anahtarları gösterilir. Bu özellik, her türün tam paketini sağladığı için yararlıdır.

Listeleri Gizle

Algılanan bazı döngüler için herhangi bir düzeltme işlemi yapılması gerekmez. Bunun nedeni, döngünün, tahsis edilmesi gerekmeyen uzun ömürlü nesneler içermesi olabilir. Ya da araç, dahil olan nesnelerin hiçbir zaman bir döngü oluşturmayacağı kanıtlanabilen belirli alanların türlerine bağlı olarak teorik bir döngü tespit edebilir. Bu tür durumlarda, bu döngüleri bildirmemek için gizleme listesi dosyalarını kullanabiliriz.

Bu araç, --suppress-list seçeneğini kullanan gizleme listesini kabul eder. Engelleme listesi dosyaları, tek satırlık girişler içeren düz metin dosyalarıdır. Engelleme listesi girişi, aşağıdaki örnekte gösterilen 4 biçimden birinde olabilir. Geçerli bir döngünün engellenmemesi için gizleme listesi girişlerini mümkün olduğunca ayrıntılı olacak şekilde eklemeniz önerilir. Yorumlar, "#" karakteri kullanılarak eklenebilir.

# 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