当与类名具有相同的方法名时,如何实例化嵌套类?

时间:2014-03-05 11:17:45

标签: java class instance builder

代码优先。

class A
{
    private A(){}
    public static A.Builder Builder()
    {
        /**
         * ERROR:
         * No enclosing instance of type A is accessible. 
         * Must qualify the allocation with an enclosing instance of type A 
         * (e.g. x.new A() where x is an instance of A).
         */
        return new A.Builder();
        // Error too
        //return new Builder();
    }

    public class Builder
    {
        private Builder()
        {}
    }
}

问:如何实例化构建器但不更改静态构建器和嵌套类名?

修改

如果类是静态的,如何保存每个构建器的日期?如何链接构建过程?

public static class Builder
{
    private Builder()
    {}

    public Builder add(int a)
    {
        return this;// how to chain the build process ?
    }
    public Builder add(float a);
    public List<Double> Build();
}

好的,我应该先google java builder模式。Here就是一个例子。

4 个答案:

答案 0 :(得分:2)

规则:如果在封闭类之外使用内部类,则它必须是静态的。

public static class Builder
{
    private Builder()
    {

    }
}

这是设计的。

答案 1 :(得分:1)

要在不使嵌套类静态的情况下进行编译,您需要一个A:

的实例
A a = new A();
return a.new Builder();

或更短的版本:

return new A().new Builder();

但是使用嵌套的静态类而不是内部类可能更有意义,因此您可以实例化新的Builder而无需创建新的A ..

答案 2 :(得分:0)

您的代码有多个错误或不良做法。 该课程的名称与您的问题无关。

构造函数看起来像方法,但它们不是。您可能认为这是一个名为Builder的方法,但它不是,它是一个构造函数,构造函数没有返回类型+名称,只是类的名称:

public class Builder
{
    private Builder() // <-- CONSTRUCTOR
    {}
}

但这是一种静态方法:

class A
{
    public static A.Builder Builder() <-- METHOD (with return type and name)
        { ... }
}

方法名称应以小写字母开头(这不会影响构造函数),因此这是一个错误,应该命名为builder()

编译问题意味着您正在尝试在静态上下文(类A的静态方法构建器)中创建非静态内部类的对象。您不能这样做,因为非静态内部类实例必须绑定到外部类的实例。

如果您不希望A.Builder实例与A实例相关,则将其设为静态。如果要绑定它们,则在A的非静态方法(或构造函数)中创建A.Builder实例,或者使用assylias指向的语法A a = new A(); Builder = a.new Builder();。在这两种情况下,您都会将一个新的Builder实例绑定到A的实例。

答案 3 :(得分:0)

实际上,我需要的是一个与之不同的静态类 C#的静态类。Here  是一个很好的解释。  如果嵌套类不是静态的,  它需要一个实例化的容器类。  这就是我理解java中的静态类的方法。