Cycle Finder כלי

שימוש

לפניכם דוגמה פשוטה עם מחזור בין שני מחלקות, 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 שמנותח. מדובר רק ברישום אינפורמטיבי ביומן.

לכל מחזור יודפסו שתי רשימות. הרשימה הראשונה מכילה תיאור של המחזור. בכל שורה מופיע קצה בתרשים ההפניה. תיאור הקצה יציג את סוג המקור, ואחריו תיאור של האופן שבו סוג המקור יתייחס לסוג היעד.

ברשימה השנייה, בקטע Full Types, מוצגים מפתחות הסוגים הייחודיים לכל סוג במחזור. האפשרות הזו שימושית כי היא מספקת את החבילה המלאה של כל סוג.

החרגת רשימות

בחלק מהמחזורים שזוהו לא נדרשת פעולה מתקנת. יכול להיות שהסיבה לכך היא שהמחזור מכיל אובייקטים לטווח ארוך שלא צריך להקצות אותם. לחלופין, הכלי עשוי לזהות מחזור תיאורטי שמבוסס על סוגים של שדות מסוימים שבהם ניתן להוכיח שהאובייקטים המעורבים לעולם לא ייצרו מחזור. במקרים כאלה אנחנו יכולים להשתמש בקובצי רשימה כדי לא לדווח על המחזורים האלה.

הכלי מקבל קבצים ברשימת חסימה באמצעות האפשרות --suppress-list. קובצי רשימות הסתרה הם קובצי טקסט פשוט שמכילים רשומות של שורה אחת. רשומה מוחרגת יכולה להופיע באחד מ-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