Cycle Finder เครื่องมือ
การใช้งาน
ตัวอย่างง่ายๆ ที่เป็นวงจรระหว่าง 2 คลาส คือ Foo และ 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.
ในเอาต์พุต คุณจะเห็น acceptAST
สําหรับไฟล์ Java แต่ละไฟล์ที่มีการแยกวิเคราะห์ก่อน นี่เป็นเพียงการบันทึกข้อมูลเท่านั้น
โดยจะมีการพิมพ์รายการ 2 รายการสำหรับแต่ละรอบ รายการแรกจะมีคำอธิบายของวงจร แต่ละบรรทัดแสดงขอบในกราฟอ้างอิง คำอธิบายขอบจะแสดงประเภทต้นทาง ตามด้วยคำอธิบายวิธีที่ประเภทต้นทางอาจอ้างถึงประเภทเป้าหมาย
รายการที่ 2 ในส่วน Full Types
จะแสดงคีย์ประเภทที่ไม่ซ้ำกันสำหรับแต่ละประเภทในวงจร ซึ่งจะเป็นประโยชน์เนื่องจากมีแพ็กเกจที่สมบูรณ์ของแต่ละประเภท
ระงับรายการ
บางรอบที่ตรวจพบไม่จำเป็นต้องดำเนินการแก้ไข ซึ่งอาจเป็นเพราะวงจรมีออบเจ็กต์ที่มีอายุยาวนานที่ไม่จำเป็นต้องจัดการดีล หรือเครื่องมืออาจตรวจจับวัฏจักรทางทฤษฎีตามประเภทของบางช่องที่สามารถพิสูจน์ได้ว่าวัตถุที่เกี่ยวข้องจะไม่เกิดเป็นวัฏจักรเลย ในกรณีเช่นนี้ เราสามารถใช้ไฟล์ระงับรายการเพื่อไม่ให้รายงานรอบเหล่านี้ได้
เครื่องมือยอมรับไฟล์ที่ระงับโดยใช้ตัวเลือก --suppress-list
ไฟล์รายการที่ระงับคือไฟล์ข้อความธรรมดาที่มีบรรทัดเดียว รายการที่ถูกระงับอาจใช้ 1 ใน 4 รูปแบบที่แสดงในตัวอย่างด้านล่าง เราขอแนะนำเมื่อเพิ่มรายการที่ถูกระงับจะต้องระบุที่เฉพาะเจาะจงที่สุดเพื่อหลีกเลี่ยงการระงับรอบที่ถูกต้อง เพิ่มความคิดเห็นได้โดยใช้ "#" อักขระ
# 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