Есть ли смысл объявлять конструктор по умолчанию в Java? - PullRequest
4 голосов
/ 12 марта 2010

Есть ли смысл объявлять конструктор по умолчанию в Java?

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

}

Ответы [ 5 ]

8 голосов
/ 12 марта 2010

Если у вас не конструктор по умолчанию, то конструктор по умолчанию неявно недоступен. Не стоит ставить один, если ваша цель не в том, чтобы кто-то делал:

MyClass myClass = new MyClass();
6 голосов
/ 12 марта 2010

Да, когда у вас есть другие конструкторы.

  • Требуется, когда вы хотите создать объект без передачи каких-либо параметров конструктору.

  • В большинстве случаев это требуется для рефлексии, особенно когда вы работаете с определенными фреймворками и библиотеками, основанными на рефлексии (например, сериализация, Hibernate, Hessian).

  • Использование сеттеров вместо этого обычно может дать вамлучший контроль.Он также хорошо работает с наследованием (когда вам нужно явно вызывать конструктор для всех специализированных классов, поскольку конструкторы не являются виртуальными.

6 голосов
/ 12 марта 2010

Java добавляет общедоступный конструктор по умолчанию без аргументов, если вы укажете без других конструкторов , поэтому есть смысл добавлять один, если вам нужен, и указывать другой. Так что в вашем случае, если вы определили свой класс следующим образом:

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

тогда вы не могли бы сделать это:

MyClass a = new MyClass();

но если бы это было определено так:

class MyClass {
  // no constructors
}

Вы могли бы.

Часто конструкторы без аргументов используются для указания псевдо-стандартных аргументов. Например:

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; }
}
3 голосов
/ 12 марта 2010

Помимо всех предыдущих аргументов для конструктора без аргументов, он является обязательным элементом JavaBeans, поскольку эти bean-компоненты могут быть созданы с использованием отражения (в частности, путем вызова Class.newInstance). Как следствие, любая инфраструктура, основанная на JavaBeans, сделает этот конструктор без аргументов обязательной частью вашей архитектуры.

Существует также дополнительное преимущество, так как конструктор без аргументов может помочь представить своего рода свободный интерфейс, позволяя вам вызывать сеттер-вызовы. Например, в компании, в которой я работал, используется для определения рядом с сеттерами и геттерами с помощью таких методов:

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);

Это был очень полезный способ создания объектов без определения конструкторов ошибок.

0 голосов
/ 12 марта 2010

Для некоторых сред требуется конструктор с нулевым аргументом / по умолчанию. Например, вам нужен один для запуска класса в качестве тестового примера JUnit. [править: удалено неверное утверждение]

Это связано с использованием отражения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...