我正在阅读一些代码,我看到了这个:
public class A {
public A(SomeObject obj) {
//Do something
}
//Some stuff
public static class B {
//Some other stuff
}
}
我想知道,因为即使内部类是public
,为什么要将它作为嵌套而不是单独的类?
另外,我可以在这里执行此操作:new A.B(SomeObject)
?我觉得这会破坏静态类的目的,但我也看到了这个实现,所以想知道。
答案 0 :(得分:18)
我想知道,因为即使内部类是公开的,为什么将它作为嵌套而不是单独的类?
要问谁上课,这真的是个问题。它可以允许外部类充当“迷你命名空间” - 如果嵌套类仅在外部类的上下文中有用,那么它似乎是合理的。它表明两个阶级之间故意紧密耦合。我经常在构建器模式的上下文中看到这个:
Foo foo = new Foo.Builder().setBar(10).build();
在这里,让Foo.Builder
嵌套在Foo
内而不是作为一个可能被称为FooBuilder
的同伴类是有意义的。
请注意,与仅不相关的类相比,它还提供了一些可见性差异。
另外,我可以在此处执行此操作:
new A.B(SomeObject)
?
不,因为B
没有带SomeObject
参数的构造函数 - 只有A
(在您给出的示例中)。
我觉得这违背了静态类的目的
你应该尝试完全你认为静态类的目的是什么,以及以什么方式破坏了这个目的。目前,这个陈述过于含糊,无法进行实际讨论。
答案 1 :(得分:5)
你会有一个像这样的内部类
private
成员或其他嵌套类。Lock
或Sync
,你不希望它与同一个包中的类所使用的同名的其他类混合。我可以在这里这样做:新的A.B(SomeObject)?
你可以。
我觉得这违背了静态类的目的
需要习惯,但一旦你开始,你可能会有麻烦不把你的整个程序变成一个file.java;)
答案 2 :(得分:2)
我很想知道,即使内部类是公开的,为什么要将它作为嵌套而不是单独的类?
看一下这个主题:Why strange naming convention of "AlertDialog.Builder" instead of "AlertDialogBuilder" in Android
另外,我可以在这里这样做:新的A.B(SomeObject)?
(更新)不,你不能这样做,因为B没有要求SomeObject的构造函数。
我希望这会有所帮助。
答案 3 :(得分: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)
无效 ...因为您没有{{1的构造函数作为参数......
5. 但是当Inner类是非静态的,那么它有对Outer类的隐式引用。
6。外部和内部类可以扩展到不同的类。
7。 SomeObject
可以使用内部类以不同或相同的方式实施多次。
答案 4 :(得分: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();
,但未创建构建器对象。
非常易读:)
答案 5 :(得分:0)
我很想知道,即使内心阶级是公开的,为什么还要这样做 嵌套而不是单独的类?
允许的简单原因是包装方便。
Static nested class in Java, why?
http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html
是的,你可以做新的A.B(SomeObject)
。但你不必接受我的话,试一试。