2012-07-06 38 views
0

好了,這裏的設置:您可以通過公共嵌套接口訪問私有[靜態]嵌套類嗎?

EnclosingClass { 

    public interface ClassFactory { 
     public static SomeClass getInstance(int which); 
    } 

    private static ClassFactoryImpl { 
     @Override 
     public static SomeClass getInstance(int which) { 
      switch(which) { 
      case 1: 
       return new SomeClassSubclassA(); 
      case 2: 
       return new SomeClassSubclassB(); 
      ... 
      } 
     } 
    } 
} 

我想能夠發出沿的行語句:

SomeClass x = EnclosingClass.ClassFactory.getInstance(instanceClassRequest); 

這可能嗎?如果不是,我怎樣才能通過它實現的接口訪問靜態嵌套類?

+2

你試過了嗎? – 2012-07-06 20:23:09

+0

...''ClassFactory''是一個接口,而不是一個類,'getInstance'不是一個靜態方法。所以你不能像你所做的那樣寫一個像EnclosingClass.ClassFactory.getInstance這樣的語句...... – 2012-07-06 20:24:24

+0

@LouisWasserman改變了它。他們應該是「靜態」的。 – dcow 2012-07-06 20:25:18

回答

2

簡短答案是「否」。您需要製作實現類的實例並將其放入靜態變量中。它看起來像這樣:

public class EnclosingClass { 
    public interface ClassFactory { 
     public SomeClass getInstance(int which); 
    } 
    public static final ClassFactory CLASS_FACTORY; 

    private static class ClassFactoryImpl implements ClassFactory { 
     public SomeClass getInstance(int which) { /* ... */ } 
    } 

    static { 
     CLASS_FACTORY = new ClassFactoryImpl(); 
    } 
} 

另請注意,實例上的方法不再是靜態的。

然後代碼調用它是這樣的:

SomeClass x = EnclosingClass.CLASS_FACTORY.getInstance(2); 
+0

謝謝,這正是我的想法。但是,我被趕上了新的ClassFactoryImpl();'部分。構建靜態類的新實例是否合適 - 換句話說,是正常的,有效的還是可以的? – dcow 2012-07-06 20:29:59

+1

是的,這是適當的。該私人內部類的「靜態」修飾符有點誤導。這意味着在這種情況下每個'ClassFactoryImpl'實例都不會附加到'EnclosingClass'的特定實例。它不像C或C++中的'static'關鍵字。如果ClassFactoryImpl在它自己的單獨的「.java」文件中,它的類聲明中不會有「static」。 – csd 2012-07-06 20:31:53

+0

有趣!我不確定有關靜態嵌套類和內部類之間差異的更詳細的細節,所以我發現這個問題[靜態嵌套類和內部類之間的區別](http://stackoverflow.com/questions/70324/java內置類和靜態嵌套類),這也很有幫助。 – dcow 2012-07-06 20:42:11