【问题标题】:How to instance the nested class when have a same method name as class name?当方法名与类名相同时如何实例化嵌套类?
【发布时间】:2014-03-05 11:17:45
【问题描述】:

代码优先。

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()
        {}
    }
}

问:如何实例化builder而不改变静态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就是一个例子。

【问题讨论】:

  • 请不要编辑以提出不相关的新问题。问一个新的。

标签: java class instance builder


【解决方案1】:

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

public static class Builder
{
    private Builder()
    {

    }
}

这是设计使然。

【讨论】:

  • 你从哪里引用?影响java?但是你不回答问题,有可能实例化那里的类吗?
  • @wener 这不是引用,而是个人知识。 :-) 如有疑问,请谷歌。
  • 我对C#静态类和java静态类感到困惑,This回答了我的问题~如果嵌套类不是静态的,它需要一个实例化的容器类。这就是我的理解java中的静态类。
  • @wener 请发布您自己的答案并接受它,以便其他人可以看到它。
【解决方案2】:

要在不使嵌套类静态化的情况下使其编译,您需要一个 A 的实例:

A a = new A();
return a.new Builder();

或更短的版本:

return new A().new Builder();

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

【讨论】:

    【解决方案3】:

    您的代码有几个错误或不良做法。 类名与你的问题无关。

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

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

    但这是一个静态方法:

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

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

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-18
        • 2013-07-05
        • 1970-01-01
        相关资源
        最近更新 更多