无法理解java中的新关键字

时间:2013-06-03 17:14:21

标签: java

可能是一个非常noob的问题

我是java新手,正在阅读用java编写的第三方api ...

我遇到了这个宣言

Foo foo = new FooBar().new Foo();

我无法理解

 FooBar().new

为什么这个声明是这样的?

在声明上述内容时会有什么好处,以及这种声明的替代方法。

非常感谢任何建议/参考。

感谢

2 个答案:

答案 0 :(得分:13)

FooBar包含一个像这样的内部类

class FooBar {

    class Foo {
      ...
    }
}

需要外部类的新实例来实例化内部类。有些类本身没有意义,因此实现为嵌套类。这里FooFooBar有关系,并且还有权访问所有后者的成员变量。

答案 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()

创建一个构建器。