[英]Why have public static class inside a class
我正在瀏覽一些代碼,我看到了這個:
public class A {
public A(SomeObject obj) {
//Do something
}
//Some stuff
public static class B {
//Some other stuff
}
}
我想知道,即使內部類是public
為什么它作為嵌套而不是一個單獨的類? 另外,我可以在這里這樣做: new AB(SomeObject)
? 我覺得這會破壞靜態類的目的,但我也看到了這個實現,所以想知道。
我想知道,即使內部類是公共的,為什么它作為嵌套而不是一個單獨的類?
無論是誰寫了這門課,這真的是一個問題。 它可以允許外部類充當“迷你命名空間” - 如果嵌套類僅在外部類的上下文中有用,那么它似乎是合理的。 它表明兩個階級之間故意緊密耦合。 我經常在構建器模式的上下文中看到這個:
Foo foo = new Foo.Builder().setBar(10).build();
在這里讓Foo.Builder
嵌套在Foo
而不是作為一個可能被稱為FooBuilder
的對等類是FooBuilder
。
請注意,與僅不相關的類相比,它還提供了一些可見性差異。
另外,我可以在這里這樣做:
new AB(SomeObject)
?
不,因為B
沒有帶SomeObject
參數的構造函數 - 只有A
做(在你給出的例子中)。
我覺得這會破壞靜態類的目的
你應該嘗試找出到底是什么你認為一個靜態類的目的是,用什么方式這違背這一目的。 目前,過於含糊不清的聲明要進行實際討論。
你會有這樣的內部類
private
成員。 Lock
或Sync
,你不希望與同一個包中的類使用的同名的其他類混合。 我可以在這里這樣做:新的AB(SomeObject)?
您可以。
我覺得這會破壞靜態類的目的
它需要習慣,但一旦你開始你可能有麻煩不能將整個程序變成一個file.java;)
我想知道,即使內部類是公共的,為什么它作為嵌套而不是一個單獨的類?
看看這個帖子: 為什么在Android中使用“AlertDialog.Builder”而不是“AlertDialogBuilder”的奇怪命名約定
另外,我可以在這里這樣做:新的AB(SomeObject)?
(更新)不,你不能這樣做,因為B沒有要求SomeObject的構造函數。
我希望這有幫助。
1. static inner
類稱為Top-Level
類。
2.這個static class
可以直接訪問其外部類靜態方法和變量。
3.您需要以這種方式從外部初始化static Inner class
...
A a = new A();
A.B b = new A.B();
4. new AB(SomeObject)
不起作用 ...因為你沒有 SomeObject
作為參數的構造函數...
5.但是,當內部類是非靜態的,那么就必須對外部類隱式引用。
6.外部和內部類可以擴展到不同的類 。
7.使用Inner Class,可以以不同或相同的方式多次實現interface's method
。
此模式經常與構建器模式一起使用。 它不僅清楚了類和它的構建器之間的關系,而且還隱藏了丑陋的構建器/工廠,使構建器更具可讀性。 例如,如果您需要構建的對象具有可選屬性而非可選屬性。
public class AnObject {
public static class AnObjectBuilder {
private AnObject anObject;
private AnObjectBuilder() {
}
private void newAnObjectWithMandatory(String someMandatoryField, ...) {
anObject = new AnObject(someMandatoryField,...)
}
public AnObjectBuilder withSomeOptionalField(String opt) {
...
}
}
public static AnObjectBuilder fooObject() {
return (new AnObjectBuilder()).newAnObjectWithMandatory("foo")
}
public static AnObjectBuilder barObject() {
return (new AnObjectBuilder()).newAnObjectWithMandatory("bar")
}
}
這樣客戶端代碼必須首先調用AnObjectBuilder
類上的靜態方法,然后使用可選的構建器方法:
AnObject.fooObject("foo").withSomeOptionalField("xxx").build();
不創建構建器對象。
很可讀:)
我想知道,即使內部類是公共的,為什么它作為嵌套而不是一個單獨的類?
允許的簡單原因是包裝方便。
http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html
是的,你可以做新的AB(SomeObject)
。 但你不必接受我的話,試一試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.