2017-03-07 17 views
1

我正在挖掘一點點到Java類的可訪問性。儘管define classes有很多可能性,但我想知道下面的例子的用例。爲什麼我要將私有構造函數與靜態嵌套類結合起來?

基本上,AnotherClass的構造函數是私有的。但是,AnotherClass有一個靜態嵌套類,可在PublicClass類中訪問。

這只是我出於好奇而想出來的東西,但是因爲它真的有效,所以我想知道爲什麼我會用這樣的東西?

public class PublicClass { 
    public PublicClass() { 
     AnotherClass.AnotherInnerClass innerClass = new AnotherClass.AnotherInnerClass(); 
     innerClass.anotherTest(); 
    } 
} 


class AnotherClass{ 
    /** 
    * Private constructor - class cannot be instantiated within PublicClass. 
    */ 
    private AnotherClass(){ 

    } 

    /** 
    * Static inner class - can still be accessed within package. 
    */ 
    static class AnotherInnerClass{ 
     public void anotherTest(){ 
      System.out.println("Called another test."); 
     } 
    } 
} 

這些類是相同的文件內。

輸出

Called another test. 
+1

*爲什麼我會永遠使用這樣的*這是醜陋的。只因爲你**可以**寫點什麼,並不代表你應該***。 –

+0

是的,我同意。我只是想知道是否有任何用例 - 就像你在一個嚴肅的項目中遇到過這樣的代碼一樣?_ – mcuenez

+0

請參閱下面的答案。我目前在一個用例中使用它,在這個用例中我的'Bar'被傳遞了很多,因爲它的參數不能在一個類中設置。通過傳遞構造器而不是對象本身,我可以檢查是否所有參數都是在調用'Builder.build()'函數時設置的,所以我確信所有設置都是正確的。 –

回答

3

AnotherInnerClass可以使用AnotherClass私有構造函數。這是用於例如在Builder pattern,它是沿此線的東西:

public class Foo { 
    public Foo() { 
     Bar.Builder barBuilder = new Bar.Builder(); 
     Bar bar = barBuilder.build(); 
    } 
} 


public class Bar{ 
    private Bar(..){ 

    } 

    static class Builder{ 
     public Bar build(){ 
      return new Bar(..); 
     } 
    } 
} 
+1

上面的評論後,我認爲你的例子作爲一個有效的理由來創建一個這樣的結構。此外,我現在將我的示例(不使用構建器模式)視爲_noone-ever-use-this_結構。 – mcuenez

相關問題