12

可能是一个非常菜鸟的问题

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

我遇到了这个声明

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

我无法理解

 FooBar().new

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

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

任何建议/参考将不胜感激。

谢谢

4

2 回答 2

13

FooBar包含这样的内部类

class FooBar {

    class Foo {
      ...
    }
}

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

于 2013-06-03T17:15:36.473 回答
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()

创建一个构建器。

于 2013-06-03T17:21:26.957 回答