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
这需要习惯,但一旦开始,您可能无法将整个程序转换为一个文件。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)
的回答是错误的,这实际上是有道理的,因为静态类没有构造函数