Cycle Finder Alat
Penggunaan
Berikut contoh sederhana dengan siklus antara dua class, Foo dan 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.
Dalam output, pertama-tama Anda akan melihat acceptAST
untuk setiap file java yang diuraikan. Ini hanyalah pencatatan informatif.
Untuk setiap siklus, akan ada dua daftar yang dicetak. Daftar pertama berisi deskripsi siklus. Setiap baris mencantumkan tepi dalam grafik referensi. Deskripsi edge akan menampilkan jenis origin, diikuti dengan deskripsi bagaimana jenis origin mungkin merujuk ke jenis target.
Daftar kedua, di bagian Full Types
menampilkan kunci jenis unik untuk setiap jenis dalam siklus. Ini berguna karena menyediakan paket lengkap dari setiap jenis.
Sembunyikan Daftar
Beberapa siklus yang terdeteksi tidak memerlukan tindakan korektif. Ini mungkin karena siklus berisi objek berumur panjang yang tidak perlu dibatalkan alokasinya. Atau, alat ini dapat mendeteksi siklus teoretis berdasarkan jenis bidang tertentu yang dapat dibuktikan bahwa objek yang terlibat tidak akan pernah membentuk siklus. Untuk kasus ini, kita dapat menggunakan file daftar sembunyikan untuk tidak melaporkan siklus ini.
Alat ini menerima file daftar penyembunyian menggunakan opsi --suppress-list
. File daftar sembunyikan adalah file teks biasa yang berisi entri satu baris. Entri daftar sembunyikan dapat menggunakan salah satu dari 4 bentuk yang ditunjukkan dalam contoh di bawah. Sebaiknya saat menambahkan entri daftar sembunyikan sespesifik mungkin untuk menghindari penghentian siklus yang sah. Komentar dapat ditambahkan menggunakan '#' karakter.
# 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