Методы с тем же именем, что и конструктор - почему?

Почему допустимо следующее:

public class Foo {
  public Foo() { ... }
  public void Foo() { ... }
}

Есть ли веская причина для именования метода так же, как класс?

Ответ 1

Моя догадка заключается в том, что это разрешено, потому что явно запрет на это добавит еще одно требование к правилам именования идентификаторов Java для очень небольшой выгоды. В отличие от, например, С++, Java всегда требует, чтобы конструкторы вызывались с ключевым словом new, поэтому нет никакой двусмысленности в отношении того, относится ли идентификатор к методу или конструктору. Я согласен с тем, что метод с тем же именем, что и его родительский класс, с первого взгляда довольно запутан, и его почти наверняка следует избегать. Тем не менее, я рад, что они решили не усложнять язык, запретив такие методы.

Ответ 2

Это отвратительно. Я бы не позволил такой вещи пережить обзор кода.

Ответ 3

Единственная действительная причина, о которой я могу думать - для использования этого - если родительский класс добавляет методы после того, как вы написали дочерний класс:

interface Father { } // version 1.0

class Son implements Father {  Son ( ) { } } // version 1.0

interface Father { void Son ( ) ; /* new method */ } // version 2.0

class Son implements Father { Son ( ) { } void Son ( ) { } } // version 2.0

Если вы не контролируете интерфейс Father, но имеете контроль над классом Son, вам нужно как-то изменить Son. Вы могли

  • Измените имя класса Son
  • Разрыв связи с классом Father
  • Добавьте метод Son

Если класс Son является зависимостью от многих других проектов, то # 1 и # 2 могут быть неприемлемыми, оставляя вас без выбора, кроме как добавить метод Son( ).

Это очень надуманный пример. Вы никогда не должны видеть такое в реальном коде.

Ответ 4

Конструктор имеет то же имя, что и класс, и попадает под пространство имен типов. Пространство имен методов отличается от пространства имен типов в Java. Так что это технически разрешено (и это не перегрузка).

Однако нет никакой реальной причины фактически называть метод таким же, как имя класса. Это будет считаться очень плохой практикой.

Ответ 5

Я не вижу в этом веской причины.

С# предоставляет ошибку компилятора - "Имена членов не могут совпадать с их типом размещения"

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

Ответ 6

Возвращаемое значение метода определяется как void, тогда как конструктор не имеет возвращаемого значения, что делает их разными и, следовательно, действительными. Почему кто-то хотел бы это сделать, однако, находится вне меня.

Ответ 7

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