代码之家  ›  专栏  ›  技术社区  ›  Artsiom Anisimau

在Java中声明默认构造函数有什么意义吗?

  •  4
  • Artsiom Anisimau  · 技术社区  · 15 年前

    在Java中声明默认构造函数有什么意义吗?

    class MyClass {
      public MyClass(){}
      public MyClass( T someArgs){
        //somecode
      }
    
    }
    
    5 回复  |  直到 15 年前
        1
  •  6
  •   Konrad Garus    15 年前

    是的,当您有其他构造函数时。

    • 如果你想的话,这是必需的 创建对象而不传递任何 构造函数的参数。

    • 在大多数情况下,需要 反思,尤其是当你工作的时候 以一定的反射为基础 框架和库(例如序列化、Hibernate、Hessian)。

    • 通常使用setter可以 给你更好的控制。它也是 与继承(其中 您需要明确地调用 所有专业的构造函数 类,因为构造函数不是 事实上的。

        2
  •  8
  •   fastcodejava    15 年前

    如果您有一个非默认的构造函数,那么默认的构造函数就不是隐式可用的。如果你的目标是不让任何人做,最好不要放一个:

    MyClass myClass = new MyClass();
    
        3
  •  6
  •   cletus    15 年前

    如果指定了Java,则添加默认的公共无ARGS构造函数。 没有其他建设者 所以,如果你需要一个并指定另一个的话,放一个是有意义的。因此,在您的案例中,如果您像这样定义类:

    class MyClass {
      public MyClass( T someArgs){
        //somecode
      }
    }
    

    那你就不能这样做了:

    MyClass a = new MyClass();
    

    但如果是这样定义的:

    class MyClass {
      // no constructors
    }
    

    你可以。

    通常不使用arg构造函数来指定伪默认参数。例如:

    class Switch {
      private boolean on;
    
      public Switch() { this(true); }
      public Switch(boolean on) { this.on = on; }
      public boolean isOn() { return on; }
      public boolean toggle() { on = !on; }
      public boolean set(boolean on) { this.on = on; return this.on; }
    }
    
        4
  •  3
  •   Riduidel    15 年前

    除了前面所有的无参数构造函数的参数外,它是JavaBeans的强制元素,因为可以使用反射(特别是通过调用 Class.newInstance )因此,任何依赖于JavaBeans的框架都将使这个无参数构造函数成为体系结构的强制部分。

    还有一个额外的好处,因为一个无参数的构造函数可以让您通过链式设置器调用来帮助引入一种流畅的接口。例如,在我工作过的一家公司中,使用如下方法定义了beside setters和getter:

    class MyClass {
        privaite int index;
        public int getIndex() { return index; }
        public void setindex(int index) { this.index = index; }
    
        public MyClass withIndex(int index) {
            setIndex(index);
            return this;
        }
    }
    

    允许我按以下方式创建对象:

    MyClass myObject = new MyClass().withIndex(2);
    

    这是在不定义bug构造函数的情况下创建对象的一种非常有用的方法。

        5
  •  0
  •   ama    15 年前

    某些框架将要求您具有零参数/默认构造函数。例如,您需要一个作为JUnit测试用例运行类。[编辑:删除了不正确的语句]

    这是因为他们使用了反射。