16

私はいくつかのコードを調べていましたが、これを見ました:

public class A {
    public A(SomeObject obj) {
      //Do something
    }
    //Some stuff
  public static class B {
    //Some other stuff
  }
}

内部クラスでさえ、publicなぜそれを別個のクラスではなくネストされたものとして持っているのでしょうか?また、ここでこれを行うことはできますnew A.B(SomeObject)か?これは静的クラスの目的を損なうと思いますが、この実装も見たので知りたいと思いました。

4

6 に答える 6

18

内部クラスでさえ公開されているので、なぜそれを個別のクラスではなくネストされたものにするのか疑問に思いました。

それは本当にクラスを書いた人に尋ねる問題です。ただし、外部クラスを「ミニ名前空間」として機能させることができます。ネストされたクラスが外部クラスのコンテキストでのみ役立つ場合は、合理的と思われます。これは、2つのクラス間の意図的な密結合を示しています。私はこれをビルダーパターンのコンテキストで最もよく見ます:

Foo foo = new Foo.Builder().setBar(10).build();

ここでは、おそらくと呼ばれるピアクラスとしてではなく、内部にFoo.Builderネストすることが理にかなっています。FooFooBuilder

また、無関係なクラスと比較して、可視性にいくつかの違いがあることに注意してください。

また、ここでこれを行うことはできますnew A.B(SomeObject)か?

いいえ、パラメーターBを持つコンストラクターがないためです- (あなたが与えた例では)持っているだけです。SomeObjectA

これは静的クラスの目的を損なうと思います

静的クラスの目的が何であるとみなすか、そしてこれがその目的をどのように無効にするかを正確に理解するように努める必要があります。現在、それはあまりにも曖昧な声明であり、現実的に議論することはできません。

于 2012-08-22T17:01:38.700 に答える
5

あなたはこのような内部クラスを持っているでしょう

  • カプセル化された外部クラスをサポートするためにのみ存在するクラスを保持できます。
  • private外部クラスまたは他のネストされたクラスのメンバーにアクセスできるようにする必要があります。
  • 静的フィールドを持つネストされたクラスが必要です(私が知っている弱い理由;)
  • 同じパッケージ内のクラスで使用される同じ名前の他のクラスと混合したくない、Lockまたはのような非常に一般的な名前のクラスがあります。Sync

ここでこれを行うことはできますか:new AB(SomeObject)?

あなたはできる。

これは静的クラスの目的を損なうと思います

慣れるまでには時間がかかりますが、一度起動すると、プログラム全体を1つのfile.javaに変換できない場合があります;)

于 2012-08-22T17:01:14.190 に答える
2

内部クラスでさえ公開されているので、なぜそれを個別のクラスではなくネストされたものにするのか疑問に思いました。

このスレッドをご覧ください:Androidで「AlertDialogBu​​ilder」ではなく「AlertDialog.Builder」の命名規則が奇妙な理由

また、ここでこれを行うことはできますか:new AB(SomeObject)?

(更新)いいえ、BにはSomeObjectを要求するコンストラクターがないため、これを行うことはできません。

これがお役に立てば幸いです。

于 2012-08-22T17:01:31.267 に答える
2

1.クラスはstatic innerクラスと呼ばれTop-Levelます。

2.これstatic classは、その外部クラスの静的メソッドと変数に直接アクセスできます。

3.static Inner classこの方法で外部から初期化する必要があります...

    A a = new A();
    A.B b = new A.B();

4. new A.B(SomeObject) 動作しません...パラメータとしてのコンストラクタがないため...SomeObject

5.ただし、Innerクラスが非静的の場合、Outerクラスへの暗黙の参照があります。

6.外部クラスと内部クラスは異なるクラスに拡張できます。

7.内部クラスを使用して、異なる方法または同じ方法で複数回interface's method実装できます。

于 2012-08-22T17:14:35.213 に答える
2

このパターンは、ビルダーパターンで非常に頻繁に使用されます。クラスとそのビルダーの関係を明確にするだけでなく、醜いビルダーコンストラクター/ファクトリーを隠し、ビルダーをより読みやすくします。たとえば、ビルドされたオブジェクトにオプションではなくオプションのプロパティが必要な場合です。

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();ビルダーオブジェクトを作成せずに。

かなり読みやすい:)

于 2012-08-22T17:33:07.367 に答える
0

内部クラスでさえ公開されているので、なぜそれを個別のクラスではなくネストされたものにするのか疑問に思いました。

それが許可されている単純な理由は、パッケージングの利便性です。

Javaの静的ネストクラス、なぜですか?

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

はい、あなたは新しいことをすることができますA.B(SomeObject)。しかし、あなたはそれについて私の言葉を受け入れる必要はありません、それを試してみてください。

于 2012-08-22T17:03:02.700 に答える