簡體   English   中英

如何使用具有私有構造函數的類的實例?

[英]How to use an instance of a class that has a private constructor?

如果我們有類A和B,並且類A的構造函數是私有的,並且我們想在B中使用A的實例,該怎么做? 我看到一個回答,說“提供一個靜態方法或變量,該方法或變量允許訪問從該類內部創建的實例”,但我不明白。

您尋找的代碼模式稱為Factory Method

該類提供了一個靜態方法,該方法返回其自己的類的實例。 私有構造函數對於該類的所有方法(包括靜態方法)都是可見的,因此靜態方法可以代表調用方調用私有構造函數。

這是這種模式的示例:

public class A {
    private A() {
    }

    public static A create() {
        return new A();
    }
}

這通常與Singleton Pattern結合使用,它將上面的示例更改為:

public class A {
    private static A INSTANCE = new A();

    private A() {
    }

    public static A getInstance() {
        return INSTANCE;
    }
}

A需要有一個提供類A實例的公共方法,例如:

class A {
  /*Constructors and other methods omitted*/
  public static A getInstance() {
    return new A();
  }
}

或者,如果B是A的內部類(反之亦然),則B可以直接引用構造函數,例如:

public class A {
    private A() {}

    public static class B {
        private A instanceOfA = new A();

        public B() {}
    }
}

設計僅具有私有構造函數的類,以便其他類無法直接實例化它。 大概有一個合理的原因。 該類可以提供用於實例化該類或獲取該類的現有實例的工廠方法。

如果需要更改設計,最好的方法是修改類。 例如,通過使構造函數可見,或添加工廠方法。 如果您不能這樣做,我認為可以使用反射來打破可見性規則並使用私有構造函數創建實例。 但是,我只會在沒有其他選擇時才這樣做,而不是在仔細分析整個應用程序的后果之前。

私有構造函數旨在使一個類不具有任何實例。 但是可以使用super()從子類訪問內容。 實現是這樣的:

公共類ClassA {
私人國際價
私人ClassA(int val)
{

  this.val = val; 

}

public int getVal(){return val;
}

}

公共類ClassB擴展了ClassA {

公共ClassB(int val){super(val); }}

...

ClassB b =新的ClassB(4);

System.out.println(“ b的值:” + b.getVal());

作為示例,請參見Calendar類。 要獲取實例,您必須不調用其構造函數,而應使用靜態方法:

Calendar rightNow = Calendar.getInstance();

資源

暫無
暫無

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

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