簡體   English   中英

為什么在類中有公共靜態類

[英]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成員。
  • 你想要一個帶有靜態字段的嵌套類(我知道這個弱的原因;)
  • 你有一個類非常通用的類,如LockSync ,你不希望與同一個包中的類使用的同名的其他類混合。

我可以在這里這樣做:新的AB(SomeObject)?

您可以。

我覺得這會破壞靜態類的目的

它需要習慣,但一旦你開始你可能有麻煩不能將整個程序變成一個file.java;)

我想知道,即使內部類是公共的,為什么它作為嵌套而不是一個單獨的類?

看看這個帖子: 為什么在Android中使用“AlertDialog.Builder”而不是“AlertDialogBu​​ilder”的奇怪命名約定

另外,我可以在這里這樣做:新的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(); 不創建構建器對象。

很可讀:)

我想知道,即使內部類是公共的,為什么它作為嵌套而不是一個單獨的類?

允許的簡單原因是包裝方便。

Java中的靜態嵌套類,為什么?

http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

是的,你可以做新的AB(SomeObject) 但你不必接受我的話,試一試。

暫無
暫無

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

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