簡體   English   中英

訪問內部匿名類成員

[英]Accessing inner anonymous class members

除了使用反射來訪問匿名內部類的成員之外,還有其他方法嗎?

您可以使用本地類而不是匿名類。 看:

public class Test {
    public static void main(String... args) {
        class MyInner {
            private int value = 10;
        }

        MyInner inner = new MyInner();
        System.out.println(inner.value);
    }
}

您可以僅在方法體中引用MyInner類型。 因此,在方法之外,您將無法使用未在其超類(在本例中為java.lang.Object )或接口中聲明的字段/方法。

匿名內部類具有類型但沒有名稱。

您可以訪問未由命名超類型定義的字段。 但是,一旦分配給命名類型變量,接口就會丟失。

顯然,您可以從內部類本身訪問字段。 添加代碼的一種方法是通過實例初始化器:

final AtomicInteger y = new AtomicInteger();
new Runnable() {
    int x;
    {
        x = 5;
        doRun(this);
        y.set(x);
    }
    public void run() {
        ... blah ...
    }
};

匿名內部類表達式返回的值具有匿名類型,因此您有一次機會在類本身之外使用它:

final int y = new Runnable() {
    int x;
    {
        x = 5;
        doRun(this);
    }
    public void run() {
        ... blah ...
    }
}.x;

您還可以通過類似於以下方式聲明的方法傳遞它:

<T extends Runnable> T doRun(T runnable);

public class AccessAnonymous {
    private Runnable runnable; // to have instance of the class

    public static void main(String[] args) throws Exception {
        AccessAnonymous a = new AccessAnonymous();
        a.a(); // init field

        Class clazz = a.runnable.getClass();
        Field field = clazz.getDeclaredField("i");
        field.setAccessible(true);

        int int1 = field.getInt(a.runnable);
        System.out.println("int1=" + int1);
    }

    public void a() {
        runnable = new Runnable() {
            private int i = 1;

            public void run() {
                i = 90;
            }

        };
        runnable.run();// change value
    }
}

在匿名類的情況下,在類引起的混亂和匿名的便利性之間也存在權衡。 復雜的類很少屬於匿名,而是命名為私有內部。

在大多數匿名課程中,我們只需要“提供”知識,並且可以在構建時完成。 在一些匿名類(例如,返回值工具)中,我們也關心一個返回值。

我們知道,不應直接訪問數據成員,而應使用getter setter。 如果您發現自己處於添加了大量getter和setter的情況,那么您可能無論如何都應該做錯了,不應該使用匿名類。

如果它實現接口或擴展現有類,則可以訪問接口或基類中定義的成員。

Fooz先生是對的,除了接口只能定義常數成員。 最好的方法是將getter / setter方法添加到您的界面,然后使用它們來獲取您的價值。 但是對於每個匿名類,你必須定義那些方法(一種痛苦)。

如果您想要可讀,可維護的代碼,請不要使用匿名類。 如果您使用匿名類並希望可讀,可維護的代碼,則在需要訪問該內部類中的元素時,請不要使用匿名類。 有辦法這樣做,但我懇求你不要使用任何這些黑客。 可讀性勝過所有其他優點。

暫無
暫無

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

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