2012-05-03 54 views
1

因此,這裏是場景。創建具有完全訪問外部類局部變量的Innerclass

我有一個類A,我希望它的一些方法的行爲有所不同,具體取決於類如何調用。

我現在已經做了是這樣的:

interface Interface{ 
    public void someMethod(); 
} 

class A{ 
    int variable; 
    Interface getA1(){ 
    return new A1(); 
    } 
    Interface getA2(){ 
    return new A2(); 
    } 
    class A1 extends A implements Interface{ 
    public void someMethod(){ 
     variable++; 
    } 
    } 
    class A2 extends A implements Interface{ 
    public void someMethod(){ 
     variable--; 
    } 
    } 
} 

現在有了這個問題是,當getA1()或getA2()被調用,它實際上將返回A1的一個完全新的實例,或A2,其中int變量完全獨立於父類A(當然,我當然知道它是如何工作的)。

所以問題是。是否有可能在java中返回某種內部類,允許您通過它的方法修改外部類中的數據?

關鍵的是讓一個類能夠以不同的方式返回修改該類的接口,具體取決於使用哪種方法創建該接口。

我可能在這裏忽略了一些簡單的東西,抱歉,但它讓我難倒了! :(

編輯:我認爲解釋它的更好的方式是 - 我想直接訪問局部變量,到一個子類(或另一個類),並在原始類中有一個方法可以創建其他類

EDIT2:爲什麼它創建一個單獨的實例時getA1()/ getA2(),可能是因爲類A1和A2被宣佈延長答:這好像如果條款被刪除的擴展的原因,那麼它按預期的方式工作。

+0

除非一個變量是私有的,否則子類將有權訪問它。不管工廠是否屬於基類,都是不同的問題。 –

回答

1

是的匿名類會做例如

interface Interface{ 
    public void someMethod(); 
} 

public class A { 
    int variable; 

    Interface getA1() { 
     return new Interface() { 
      @Override 
      public void someMethod() { 
       variable++; 
      } 
     }; 
    } 
} 

但應該指出,這相當於聲明非靜態內部類,儘管更簡潔。

+0

OH哇!有效!謝謝!我認爲我忽略了它,因爲我認爲它會和嵌套類做同樣的事情...... Java以神祕的方式工作... – Liang

+0

應該注意,代碼不是線程安全的。如果兩個不同的線程調用getA1()。someMethod()同時,對於短時間的齒,你不能確切地說「變量」將包含哪個值。 – user3001

+0

如果你定義了一個完整的內部類,這應該*完全相同。僅僅因爲內部類是匿名的並不意味着它對其父類的字段具有「特殊訪問」。他們完全一樣。唯一的區別是內部類是命名的,匿名類不是。 –

1

首先,我發現它奇怪你的內部類正在擴展外部類。我想不出有一個很好的理由去做這件事,我不確定那是甚麼。

除此之外,我不明白你的問題。所有內部類都可以訪問其父類的字段。例如,以下內容:

public class Tester { 
    private int myInt; 

    public InnerTester getInnerTester() { 
    return new MyInnerTester(); 
    } 

    public InnerTester getOtherInnerTester() { 
    return new OtherInnerTester(); 
    } 

    public interface InnerTester { 
    public void doStuff(); 
    } 

    public class MyInnerTester implements InnerTester{ 
    @Override 
    public void doStuff() { 
     myInt++; 
    } 
    } 

    public class MyOtherInnerTester implements InnerTester { 
    @Override 
    public void doStuff() { 
    myInt++; 
    } 
    } 

    public static void main(String[] args) { 
    Tester tester = new Tester(); 
    System.out.println("Before: " + tester.myInt); 
    tester.getInnerTester().doStuff(); 
    tester.getOtherInnerTester().doStuff(); 
    System.out.println("After: " + tester.myInt); 
    } 
} 

輸出:

Before: 0 
After: 2 

然而,這一切似乎是相當黑幕。我不確定你爲什麼想要利用這種行爲。我之前用動作監聽器做過類似的事情,但我不會完全調用他們的父對象「ActionListenerFactory」。爲什麼你不只有一種方法來增加對象本身的字段?

+0

嗨蒂姆,問題是,當你實例化一個嵌套類時,它似乎訪問它的外部變量的唯一集合(在我的例子中是這樣做的)。草莓發佈的方法似乎避免了這一點。 – Liang

+0

@梁這還是不對的。內部類與他們的父實例綁定。無論內部類有多少實例,它們仍然與我最初的'Tester'實例綁定,並可以訪問他的'myInt'。看我的編輯,看看我在說什麼。 –

+0

是的我認爲你是對的,我認爲這是事實,在我的情況下,我的內部類擴展了外部類,這導致了這種奇怪的行爲。乾杯 – Liang