Методы с тем же именем, что и конструктор - почему?
Почему допустимо следующее:
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
причина в том, что в конструкторах мы передаем значения во время создания объекта класса. Так что имя конструктора должно быть таким же, чтобы оно могло принимать переданные значения и инициализироваться во время создание объекта класса.