为什么在类中有公共静态类

noM*_*MAD 15 java nested-class

我正在浏览一些代码,我看到了这个:

public class A {
    public A(SomeObject obj) {
      //Do something
    }
    //Some stuff
  public static class B {
    //Some other stuff
  }
}
Run Code Online (Sandbox Code Playgroud)

我想知道,因为即使内部类是public为什么它作为嵌套而不是一个单独的类?另外,我可以在这里这样做new A.B(SomeObject)吗?我觉得这会破坏静态类的目的,但我也看到了这个实现,所以想知道.

Jon*_*eet 18

我想知道,即使内部类是公共的,为什么它作为嵌套而不是一个单独的类?

无论是谁写了这门课,这真的是一个问题.它可以允许外部类充当"迷你命名空间" - 如果嵌套类在外部类的上下文中有用,那么它似乎是合理的.它表明两个阶级之间故意紧密耦合.我经常在构建器模式的上下文中看到这个:

Foo foo = new Foo.Builder().setBar(10).build();
Run Code Online (Sandbox Code Playgroud)

在这里我有意义Foo.Builder嵌套在内部Foo而不是作为一个可能被调用的对等类FooBuilder.

请注意,与仅不相关的类相比,它还提供了一些可见性差异.

另外,我可以在这里这样做new A.B(SomeObject)吗?

不,因为B没有带SomeObject参数的构造函数 - 只有A(在你给出的例子中).

我觉得这会破坏静态类的目的

你应该尝试找出究竟是什么,你认为一个静态类的目的是,用什么方式这违背这一目的.目前,过于含糊不清的声明要进行实际讨论.


Pet*_*rey 5

你会有这样的内部类

  • 你可以保留一个只存在的类来支持封装的外部类.
  • 您希望能够访问private外部类或其他嵌套类的成员.
  • 你想要一个带有静态字段的嵌套类(我知道这个弱的原因;)
  • 你有一个非常通用名称的类,Lock或者Sync你不希望与同一个包中的类使用的其他同名类混合使用.

我可以在这里这样做:新的AB(SomeObject)?

您可以.

我觉得这会破坏静态类的目的

它需要习惯,但一旦你开始你可能有麻烦不能将整个程序变成一个file.java;)