Cycle Finder כלי

Usage

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

# 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