Перегрузка конструкторов в 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> и использовать его для обеспечения безопасности типов и указания компилятору правильно разрешить эту двусмысленность?

Я не знаю. Моя реальная проблема решена с помощью третьего конструктора в качестве обходного пути и некоторого дублирования кода. Такова жизнь.