Я просто смотрел код Java Hamcrest на GitHub и заметил, что они использовали стратегию, которая казалась неинтуитивной и неудобной, но мне стало интересно, не хватает ли я чего-то.
Я заметил в API HamCrest, что есть интерфейс Matcher и абстрактный класс BaseMatcher. Интерфейс Matcher объявляет этот метод с помощью этого javadoc:
/**
* This method simply acts a friendly reminder not to implement Matcher directly and
* instead extend BaseMatcher. It easy to ignore JavaDoc, but a bit harder to ignore
* compile errors .
*
* @see Matcher for reasons why.
* @see BaseMatcher
* @deprecated to make
*/
@Deprecated
void _dont_implement_Matcher___instead_extend_BaseMatcher_();
Затем в BaseMatcher этот метод реализуется следующим образом:
/**
* @see Matcher#_dont_implement_Matcher___instead_extend_BaseMatcher_()
*/
@Override
@Deprecated
public final void _dont_implement_Matcher___instead_extend_BaseMatcher_() {
// See Matcher interface for an explanation of this method.
}
По общему признанию, это и эффективно и мило (и невероятно неудобно). Но если намерение для каждого класса, которое реализует Matcher, также расширить BaseMatcher, зачем вообще использовать интерфейс? Почему бы просто не сделать Matcher абстрактным классом в первую очередь и у него есть все другие матчи? Есть ли какое-то преимущество для этого, как это сделал Hamcrest? Или это отличный пример плохой практики?
ИЗМЕНИТЬ
Некоторые хорошие ответы, но в поисках более подробной информации я предлагаю щедрость. Я думаю, что проблема обратной/двоичной совместимости - лучший ответ. Тем не менее, я хотел бы, чтобы проблема совместимости была разработана более, в идеале, с некоторыми примерами кода (желательно на Java). Кроме того, существует ли нюанс между "обратной" совместимостью и "двоичной" совместимостью?
ДАЛЬНЕЙШЕЕ ИЗОБРАЖЕНИЕ
7 января 2014 года - pigroxalot предоставил ответ ниже, ссылаясь на этот комментарий к Reddit авторов HamCrest. Я призываю всех прочитать его, и если вы найдете его информативным, ответьте на вопрос о свиносалоте.
ДАЖЕ ДАЛЬНЕЙШЕЕ ИЗОБРАЖЕНИЕ
12 декабря 2017 года - ответ на pigroxalot был как-то удален, не уверен, как это произошло. Это слишком плохо... эта простая ссылка была очень информативной.