[英]Java public class with public constructor with non-public parameter. Why?
Java允許定義以下一對類。
class Class1 { ... }
public Class2 { public Class2(Class1 c1) { ... } }
如果由於無法訪問Class1而無法實例化它,為什么Class2具有公共構造函數?
出於記錄,沒有從Class1繼承的公共類。
Class1
和Class2
在同一包中定義。 這樣它們就可以訪問了。 Class1
具有默認的訪問修飾符,該修飾符對於同一包中的所有類均可見
乍一看,這似乎沒有任何意義:此軟件包的用戶可以訪問Class2。 但是他無法創建Class2的實例,因為他無權訪問Class1。 因此,沒有理由使得構造的public
,當它需要的參數是不public
為好。
實際上唯一有意義的情況是,同一包中有另一個擴展Class1的public
類。 然后,您可以創建此類的實例,並將其傳遞給構造函數:
// Assuming this class extends Class1, and it is public, you
// can create an instance of this class from outside the package:
ExtendedClass1 e = new ExtendedClass1();
// This is using the public constructor that expects a Class1.
// Although Class1 itself is NOT public, this constructor
// can be called with an instance of a (public) class that
// extends Class1
Class2 c = new Class2(e);
但是由於在問題中排除了后者,因此沒有理由擁有這個公共構造函數。
合理的做法是,將一個類限制其對同一包成員的創建/訪問,以使同一包中的其他類可以擴展該類並公開。
例如,如果您正在實施Template模式,則您可能具有超類(可能是抽象的),該超類實現了基礎,共享,邏輯,並帶有一個或多個實現了不同步驟的具體類。
然后,調用者可以實例化這些具體的類,而基類則不能。
可以爭論的是,盡管可以保護基類而不是包范圍。
每個類都有一個默認的構造函數(如果不提供),則可以執行以下操作:
Class1 c1 = new Class1();
然后
Class2 c2 = new Class2(c1);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.