Cycle Finder Araç

Kullanım

Aşağıda, Foo ve Bar adlı iki sınıf arasındaki bir döngüyle ilgili 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, ayrıştırılan her Java dosyası için önce acceptAST değerini görürsünüz. Bu sadece bilgilendirme amaçlı bir günlük kaydıdır.

Her döngü için iki liste yazdırılır. İlk listede döngünün bir açıklaması yer alır. Her çizgi, referans grafiğinde bir kenar belirtir. Kenar açıklaması, kaynak türünü ve ardından kaynak türünün hedef türüne nasıl atıfta bulunabileceğiyle ilgili bir açıklama gösterir.

Full Types altındaki ikinci listede, döngüdeki her tür için benzersiz tür anahtarları gösterilir. Bu, 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, ayrılması gerekmeyen uzun ömürlü nesneler içermesi olabilir. Ya da araç, ilgili nesnelerin hiçbir zaman bir döngü oluşturmayacağının kanıtlandığı belirli alan türlerine dayanarak teorik bir döngüyü tespit edebilir. Bu durumlarda, bu döngüleri raporlamamak için gizli liste dosyalarını kullanabiliriz.

Araç, --suppress-list seçeneği kullanılan gizli liste dosyalarını kabul eder. Gizleme listesi dosyaları, tek satırlık girişler içeren düz metin dosyalarıdır. Gizli liste girişi, aşağıdaki örnekte gösterilen 4 biçimden birinde olabilir. Geçersiz liste girişleri eklerken, geçerli döngüyü engellememek için mümkün olduğunca spesifik giriş yapmanız önerilir. "#" ile yorum eklenebilir karakteriyle ayrılır.

# 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