[英]Referencing an anonymous inner class before its definition
在另一篇文章中 ,有人告訴我在使用該函數的函數“之后”(下面)定義一個匿名內部類是錯誤的。 但是,類似下面的內容可以編譯並正常運行:
public class CompTest {
public static void main(String[] args) {
TreeSet<Integer> ts = new TreeSet<Integer>(intComp);
ts.add(1);
ts.add(2);
ts.add(3);
System.out.println(ts.toString());
}
private static Comparator<Integer> intComp = new Comparator<Integer>() {
@Override
public int compare(Integer i1, Integer i2) {
return i2.compareTo(i1);
}
};
}
官方的話是什么? 我的猜測是,由於intComp
是static
,所以當類CompTest
被“加載”時,它將實例化一次(由於只有一個主方法並且沒有CompTest
對象,所以不確定確切的加載方式),因此當main()
需要intComp
,無論它在源文件中的實際位置是什么,它都可用。
即使它確實起作用了(出於上述原因,甚至還有其他原因)……這是不好的做法嗎?
我相信您是指此評論:
“比較器定義應在添加代碼之前– Bryan Glazer”
沒有任何技術原因把intComp
聲明之前(或之后)的main
聲明。 無論哪種方式,它都可以正常工作。
較早放置比較器的唯一可能原因是風格。 也就是說, intComp
聲明是一個靜態變量 , 通常在類的開頭聲明變量。
我傾向於同意樣式,但這是一個小問題。 另外,如果是我,我將比較器聲明為final
,給它一個更有意義的名稱,並使用“常量”命名方式; 例如INT_COMP
(但更有意義)。
Re Nambari的評論:
“我認為這是一種不好的做法,匿名類只適用於有限范圍而不是全局范圍。”
這是無稽之談。 以這種方式使用匿名類非常普遍。 當然,匿名類也可以在嵌套作用域中使用,這是它們的優點之一,但絕不意味着該模式是錯誤的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.