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