Я тоже думаю о таких вещах:
Предположим, что у нас есть этот тип:
public interface Foo {
int getID();
}
Затем по какой-либо причине вводится тип идентификатора:
public interface Foo {
FooID getID();
}
Теперь предположим, что какой-то клиент был написан до изменения, а клиент содержит такой код:
if (A.getID() == B.getID()) {
someBehavior();
}
Где A
и B
равны Foos
.
Этот код будет нарушен после изменения, потому что примитивное сравнение равенства (==
) между int
s, которое было приемлемо до изменения, теперь неправильно сравнивает ссылочные значения, а не вызывает equals(Object)
для идентификаторов .
Если бы getID()
произвел Integer
с самого начала, правильный код клиента был бы (хорошо, правильный код клиента , возможно, был бы таким. Преобразования бокса были бы применены с ==
так что это бы тоже сработало):
if (A.getID().equals(B.getID())) {
someBehavior();
}
Что по-прежнему верно после эволюции программного обеспечения.
Если бы изменение было «обратным», другими словами, если бы getID()
первоначально произвёл некоторый тип FooID
, то если бы он был изменен для получения int
, компилятор жаловался бы на вызов equals(Object)
на примитив и код клиента были бы исправлены.
Кажется, что есть чувство "будущего" с не примитивным типом. Согласен? Не согласен?