簡體   English   中英

在java中,如何使用私有構造函數創建一個類,其超類也有一個私有構造函數?

[英]In java, how do I make a class with a private constructor whose superclass also has a private constructor?

舉個例子:

public class Foo {
    private Foo() {}
}

public class Bar extends Foo {
    private Bar() {}

    static public doSomething() {
    }
}

那是一個編譯錯誤。 一個類至少需要隱式調用它的超類的默認構造函數,在這種情況下,它在Foo中是不可見的。

我可以從Bar調用Object的構造函數嗎?

你不能。 你需要讓Foo的構造函數包至少是私有的(雖然我可能只是讓它受到保護。

(編輯 - 這篇文章中的評論很有用)

這實際上是一種糟糕的繼承形式的症狀,稱為實現繼承。 原始類不是為了繼承而設計的,因此選擇使用私有構造函數,或者整個API設計不當。

解決這個問題的方法不是找出繼承的方法,而是要確定是否可以組合對象而不是繼承,並通過接口來實現。 即,Foo類現在是Foo接口,具有FooImpl。 然后界面欄可以擴展Foo,使用BarImpl,它與FooImpl無關。

在BarImpl內部,如果你想做一些代碼重用,你可以將FooImpl作為成員,但這完全取決於實現,並且不會暴露。

只要Foo具有私有構造函數,您將無法創建Bar的實例。 你能做到的唯一方法就是Foo有一個受保護的構造函數。

你不能直接從Bar調用Object的構造函數,而它是Foo的子類,它必須通過Foo的構造函數,在這種情況下是私有的。

當您將Foo的構造函數聲明為private時,它不會創建默認的公共構造函數。 由於Bar 必須調用Foo的構造函數,因此不可能將其保密。 我會像其他人一樣建議使用protected而不是private。

暫無
暫無

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

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