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

Java 为什么在类中有公共静态类,java,nested-class,Java,Nested Class,我正在浏览一些代码,我看到了: public class A { public A(SomeObject obj) { //Do something } //Some stuff public static class B { //Some other stuff } } 我想知道,既然内部类是public,为什么它是嵌套的而不是单独的类? 另外,我可以在这里执行此操作:新建A.B(SomeObject)?我觉得这违背了静态类的目的,但我也看

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

public class A {
    public A(SomeObject obj) {
      //Do something
    }
    //Some stuff
  public static class B {
    //Some other stuff
  }
}
我想知道,既然内部类是
public
,为什么它是嵌套的而不是单独的类?
另外,我可以在这里执行此操作:
新建A.B(SomeObject)
?我觉得这违背了静态类的目的,但我也看到了这个实现,所以我想知道。

您会有这样一个内部类

  • 您可以保留一个只支持封装外部类的类
  • 您希望能够访问外部类或其他嵌套类的
    private
    成员
  • 您需要一个带有静态字段的嵌套类(我知道这是一个薄弱的原因;)
  • 您有一个具有非常通用名称的类,如
    Lock
    Sync
    ,您不希望与同一包中的类使用的相同名称的其他类混合
我能在这里做这个吗:新的A.B(SomeObject)

你可以

我觉得这违背了静态类的目的


这需要习惯,但一旦开始,您可能无法将整个程序转换为一个文件。java;)

我想知道,既然内部类也是公共的,为什么要将其作为嵌套类而不是单独的类?

看看这条线:

另外,我可以在这里执行以下操作:新建A.B(SomeObject)?

(更新)不,您不能这样做,因为B没有要求SomeObject的构造函数

我希望这有帮助

我想知道,既然内部类也是公共的,为什么它是嵌套的而不是单独的类

这确实是一个问题,要问谁写了这门课。不过,它可以允许外部类充当“迷你名称空间”——如果嵌套类仅在外部类的上下文中有用,这似乎是合理的。这表明这两个类之间有意的紧密耦合。我经常在构建器模式的上下文中看到这一点:

Foo foo = new Foo.Builder().setBar(10).build();
在这里,让
Foo.Builder
嵌套在
Foo
中,而不是作为一个对等类(可能称为
FooBuilder
)是有意义的

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

另外,我可以在这里执行此操作:
新建A.B(SomeObject)

否,因为
B
没有带
SomeObject
参数的构造函数-只有
a
有(在您给出的示例中)

我觉得这违背了静态类的目的

您应该尝试准确地了解您认为静态类的目的是什么,以及它以何种方式违背了该目的。目前,这一声明过于含糊,无法进行实际讨论

我想知道,既然内部类都是公开的,为什么要将其作为 嵌套而不是单独的类

允许使用的原因很简单,就是包装方便


是的,您可以新建
A.B(SomeObject)
。但是你不必相信我的话,试试看。

1。一个
静态内部
类被称为
顶级

2.
静态类
可以直接访问其外部类静态方法和变量。

3。您需要以这种方式从外部初始化
静态内部类

    A a = new A();
    A.B b = new A.B();
4.
新的A.B(SomeObject)
将不起作用。。。因为您没有将
SomeObject
作为参数的构造函数

5.但是当内部类是非静态的时,它会隐式引用外部类

6.外部类和内部类可以扩展到不同的类


7.一个
接口的方法可以使用内部类以不同或相同的方式实现多次。

此模式通常与生成器模式一起使用。它不仅明确了类与其构建器之间的关系,还隐藏了丑陋的构建器/工厂,使构建器更具可读性。例如,如果您需要生成的对象具有可选属性和非可选属性

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.foooObject(“foo”)。带有someOptionalField(“xxx”).build()而不创建生成器对象


可读性强:)

您的链接当前指向最后一个答案。我建议使用这个链接,但根据下面给出的其他答案,我认为您对
新A.B(SomeObject)
的回答是错误的,这实际上是有道理的,因为静态类没有构造函数