可能是一个非常noob的问题
我是java新手,正在阅读用java编写的第三方api ...
我遇到了这个宣言
Foo foo = new FooBar().new Foo();
我无法理解
FooBar().new
为什么这个声明是这样的?
在声明上述内容时会有什么好处,以及这种声明的替代方法。
非常感谢任何建议/参考。
感谢
答案 0 :(得分:13)
FooBar
包含一个像这样的内部类
class FooBar {
class Foo {
...
}
}
需要外部类的新实例来实例化内部类。有些类本身没有意义,因此实现为嵌套类。这里Foo
与FooBar
有关系,并且还有权访问所有后者的成员变量。
答案 1 :(得分:4)
请参阅@Reimeus关于第一个问题的回答。
至于你的第二个问题:
此类声明的替代方案
如果内部类可以独立于外部类创建,则可以使内部类静态,如:
public class FooBar
{
// ...
public static class Foo
{
// ...
}
}
然后你将实例化:
new Foobar.Foo()
这种静态内部类的经典用法是您班级的构建器类(从Effective Java中提取的配方 - 购买此书)。这是创建不可变实例的好方法,也是“流畅接口”的一个很好的例子,因为通常所有构建器方法都返回构建器实例本身:
public class MyClass
{
public static Builder newBuilder()
{
return new Builder();
}
private MyClass(final Builder builder)
{
// build according to data in builder
}
public static class Builder
{
private Builder()
{
}
// methods to add data to builder, then:
public MyClass build()
{
return new MyClass(this);
}
}
}
你会注意到静态工厂方法newBuilder()
;这允许你写:
MyClass.newBuilder()
而不是
new MyClass.Builder()
创建一个构建器。