簡體   English   中英

將類作為final並將類構造函數設置為private是有區別的

[英]What is the difference between having a class as final and having a class constructor as private

最終類和將類構造函數作為私有類之間的區別究竟是什么。

我知道兩者都不能被分類(如果我錯了,請糾正我)。 他們有什么不同嗎?

最后一堂課不能延期。 它阻止了這一點

final class FinalClass {

}

// and later

class ExtendedClass extends FinalClass { // ERROR

}

這對像String這樣的東西很有用 - 你不希望有人能夠覆蓋String的邏輯,這是最常用的對象之一,並且能夠,哦,我不知道,添加網絡並發送所有你使用的字符串。 如果可以擴展String,則可以執行此操作。

私有構造函數不能在類外部調用。

class PrivateCons {

    private PrivateCons() {

    }
}

// later
PrivateCons pc = new PrivateCons(); // ERROR

通常這最終會像這樣工作:( java.lang.Math是一個很好的例子)

class FuncLib {
    private FuncLib() { } // prevent instantiation
    public static void someFunc(...) { }
    public static int anotherFunc(...) { }
}

或者它最終像這樣工作//整數實際上是這樣做的

class VerySpecial {

    private static Map<String,VerySpecial> cache;

    public static VerySpecial generate(String data) {
        VerySpecial result = cache.get(data);
        if(result == null) {
            result = new VerySpecial(data);
            cache.put(data,result);
        }
        return result;
    }

    private String data;

    private VerySpecial() { }

    private VerySpecial(String data) { this.data = data}

}

擴展類時,默認情況下構造函數會嘗試調用默認(無參數)構造函數。 如果它是私有的,那么在擴展它時必須顯式調用非私有構造函數。 如果您沒有非私有構造函數來調用,則無法擴展它。 感謝您發表評論。 :-)

實例化

  • 您無法使用私有構造函數實例化類。 但是您可以將它用作具有靜態方法的實用程序類。
  • 最后一個類可以實例化但不能擴展,顯然你不能用私有構造函數擴展一個類,因為隱式的super()調用會失敗。

看看它有一個私有構造函數的Math類,無法實例化它有很多非常有用的靜態方法

只擁有私人建設者比擁有最終階級更強大。

詳細說明:在類A中只有私有構造函數會強烈影響對象的創建。 通常,您使用的是工廠方法。 您仍然可以使用技巧(例如clone()或反射調用私有構造函數)在沒有工廠方法的情況下創建A的實例。 子類化是不可能的 ,因為子類的構造函數需要能夠調用super() 這只能在A內的嵌套類中實現。

只有私有構造函數通常是有意義的,例如通過工廠方法控制實例化,例如對於singeltons(參見Effective Java item 3)。 但即使在這種情況下,我也沒有理由不編寫“最終類”,如果只是為了文檔,那么讀者會立即意識到不允許繼承子類。

如果您不希望您的班級被分類,那么您使用final。 如果您不希望其他類實例化您的類,而是希望控制對象的構造和維護方式,則使用私有構造函數。

最終的類/方法永遠不會被繼承/重寫,並且會拋出編譯錯誤,因為具有私有構造函數的類也將拋出“沒有默認構造函數可用於您的類”的編譯,並且一旦你添加了非最終構造函數並調用它來自你的孩子班,沒有錯誤。

私有構造函數在創建單例類(僅存在一個類的實例)的情況下非常有用,其中您將構造函數設置為私有,並使用變量來存儲單個實例,這將使用公共靜態方法公開。 對於前

public class Singleton{    
private static final Singleton instance = new Singleton();

//private constructor to avoid client applications to use constructor
private Singleton(){}

public static Singleton getInstance(){
    return instance;
}}

例如,java中的String類是最終類。

private成員可以通過內部類訪問。

public class Outer {
  private Outer() {
    System.out.println("Outer()");
  }

  static class Inner extends Outer {
    {
      System.out.println("Inner()");
    }
  }

  public static void main(String... args) {
    new Inner();
  }
}

版畫

Outer()
Inner()

最終的類不能擴展,但它的構造函數可以是公共的。 私有構造函數可以從另一個構造函數調用或由內部類使用。

暫無
暫無

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

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