Перегрузка конструкторов в Java (не только) полезна для общего дизайна. При эффективном использовании это может привести к правильной и эффективной инициализации класса и избежанию многих строк шаблонного кода.
Вчера столкнулся со следующей проблемой. Я написал класс следующим образом:
public class Foo { public Foo(Integer i, Double d) { ... } public Foo(Integer i, Float f) { ... } }
который определяет класс Foo
с двумя конструкторами, которые принимают Integer
и Double
, а также Integer
и Float
.
По какой-то причине (не важно сейчас) я хотел инициализировать первый (Integer,Double)
со вторым параметром, установленным как null
.
Это привело к ошибке компилятора, потому что компилятор на самом деле не мог решить, какой из двух конструкторов я хотел использовать. Упс… что я мог сделать?
Я мог бы ввести третий конструктор только с одним параметром и вызвать его. Попробуйте, вы увидите, что в конечном итоге вы будете использовать часть инициализации двух других, что может усложнить ситуацию (по крайней мере, так было в моем случае).
Увлекательно, не так ли? Может быть, нам нужен Null<Double>
или Null<Float>
, чтобы избежать этого беспорядка? Может быть, значение null
должно быть общим Null<T>
и использовать его для обеспечения безопасности типов и указания компилятору правильно разрешить эту двусмысленность?
Я не знаю. Моя реальная проблема решена с помощью третьего конструктора в качестве обходного пути и некоторого дублирования кода. Такова жизнь.