Току-що разглеждах кода на 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's 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. Насърчавам всички да го прочетат и ако го намерите за информативен, гласувайте за отговора на pigroxalot.
ОЩЕ ДОПЪЛНИТЕЛНО РЕДАКТИРАНЕ
12 декември 2017 г. - отговорът на pigroxalot беше премахнат по някакъв начин, не знам как се е случило това. Жалко... тази проста връзка беше много информативна.
internal
. Това изглежда като ужасен хак от някой, който не знае как да програмира правилно. - person Federico Berasategui   schedule 21.12.2013internal
в Java; сигурно мислите за C#. - person ajb   schedule 21.12.2013Error
. - person ZhongYu   schedule 21.12.2013Iterator.remove()
- person ZhongYu   schedule 21.12.2013