2012-02-20 11 views
1

我希望做這樣的事情在Java中:是否可以實例化一個類並將它賦予Java中的單個語句中的成員變量?

public OuterClass { 

    public innerClass = new Object() { 
     private var1; 

     public void myMethod() { 
      ... 
     } 
    } 

} 

,並使用它像這樣:

OuterClass outer = new OuterClass(); 
outer.innerClass.myMethod(); 

的原因是爲了basiclly命名空間內的在OuterClass一些方法,以保持組織的事情。

我知道我可以創建一個innerClass的實例並將其分配給OuterClass的公共實例變量,但我正在尋找一種像上面的示例一樣的內聯方式。我不希望它有可能多次實例化innerClass,因此是內聯方法。

這woule類似於下面的JavaScript:

var innerObject = new function() { 
    ...  
} 
+0

你有沒有考慮過Singleton設計模式? – 2012-02-20 16:38:50

+0

號碼雖然內部類需要訪問outclass的成員變量。 – Camsoft 2012-02-20 16:41:48

回答

2

你在問題標題中提出的問題是可能的,但不幸的是不是你真正想要的。

在您的代碼中,innerClass字段聲明的行忽略該字段的類型。其餘代碼不變,只有一種可能性:Object

所以,你的代碼會讀這樣的:

其實,這是可能的,但調用該方法myMethod是不可能的。當你訪問outer.innerClass時,這個表達式的類型是Object,它沒有方法myMethod,所以代碼不會編譯。

可以然而引入接口MyInnerInterface

interface MyInnerInterface { 
    void myMethod(); 
} 

和改變字段的類型MyInnerInterface

public OuterClass { 

    public MyInnerInterface innerClass = new MyInnerInterface() { 
     private var1; 

     public void myMethod() { 
      ... 
     } 
    } 
} 

然後訪問方法是可能的。但是,您有其他接口的缺點。

此代碼是不尋常的,我不認爲它很好。如果你真的想在這裏有一個內部類,不要使用匿名類,而是一個真正的類:

public OuterClass { 

    public class InnerClass { 
     private var1; 

     public void myMethod() { 
      ... 
     } 
    } 

    public InnerClass innerClass = new InnerClass(); 
} 

儘管如此,使用一個內部類的「作用域」從外部訪問的東西我不會」不要做。內部類通常應該是外部類的實現細節,而不是公衆可以訪問的。最好考慮如何將你的API分成真正的共存類(當然這可能會引用對方,並可能訪問包私有成員)。

+0

這是總的意義。謝謝。 – Camsoft 2012-02-20 16:58:01

0

你試過:

public class OuterClass { 

    public static void main(String[] args) { 
     OuterClass o = new OuterClass(); 
     o.new InnerClass().method(); 
    } 

    class InnerClass { 

     public void method() { 
      //do something 
     } 
    } 
} 

使用你建議的語法,但並沒有解決,你不希望你的要求InnerClass的多個實例。

相關問題