簡體   English   中英

在定義之前引用匿名內部類

[英]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);
        }
    };

}

官方的話是什么? 我的猜測是,由於intCompstatic ,所以當類CompTest被“加載”時,它將實例化一次(由於只有一個主方法並且沒有CompTest對象,所以不確定確切的加載方式),因此當main()需要intComp ,無論它在源文件中的實際位置是什么,它都可用。

即使它確實起作用了(出於上述原因,甚至還有其他原因)……這是不好的做法嗎?

我相信您是指此評論:

“比較器定義應在添加代碼之前– Bryan Glazer”

沒有任何技術原因把intComp聲明之前(或之后)的main聲明。 無論哪種方式,它都可以正常工作。

較早放置比較器的唯一可能原因是風格。 也就是說, intComp聲明是一個靜態變量通常在類的開頭聲明變量。

我傾向於同意樣式,但這是一個小問題。 另外,如果是我,我將比較器聲明為final ,給它一個更有意義的名稱,並使用“常量”命名方式; 例如INT_COMP (但更有意義)。


Re Nambari的評論:

“我認為這是一種不好的做法,匿名類只適用於有限范圍而不是全局范圍。”

這是無稽之談。 以這種方式使用匿名類非常普遍。 當然,匿名類可以在嵌套作用域中使用,這是它們的優點之一,但絕不意味着模式是錯誤的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM