可能是一个非常菜鸟的问题
我是java新手,正在阅读用java编写的第三方api......
我遇到了这个声明
Foo foo = new FooBar().new Foo();
我无法理解
FooBar().new
为什么这个声明是这样的?
声明上述内容有什么好处,以及这种声明的替代方法是什么。
任何建议/参考将不胜感激。
谢谢
可能是一个非常菜鸟的问题
我是java新手,正在阅读用java编写的第三方api......
我遇到了这个声明
Foo foo = new FooBar().new Foo();
我无法理解
FooBar().new
为什么这个声明是这样的?
声明上述内容有什么好处,以及这种声明的替代方法是什么。
任何建议/参考将不胜感激。
谢谢
FooBar
包含这样的内部类
class FooBar {
class Foo {
...
}
}
需要外部类的新实例来实例化内部类。有些类本身没有意义,因此被实现为嵌套类。这里与后者Foo
有关系,FooBar
并且还具有访问后者所有成员变量的好处。
请参阅@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()
创建一个构建器。