Лучшие практики для расширения служебных классов в Java
Я расширил классы из apache-commons-3, чтобы добавить свои собственные служебные функции, которые в них недоступны. например:
public class CollectionUtils extends org.apache.commons.collections.CollectionUtils
{
/**
* Similar to collection.contains(member) except just doesn't throw NPE when set is null, simply returns false
* @param collection
* @param member
* @return
*/
public static <K> boolean contains(Collection<K> collection,K member)
{
return collection!=null && collection.contains(member);
}
}
Это решило мою цель использования моих функций и общих функций через один и тот же класс CollectionUtils
,
Но Apache удалил расширяемость в версии 4, введя частные конструкторы в служебные классы. Здесь также обсуждается то же самое.
Теперь мой код ломается, если я обновляюсь до версии 4. Каковы рекомендации по расширению служебных классов для добавления пользовательских / определенных служебных методов?
1 ответ
Хотя я голосовал близко как "основанный на мнении", я хотел дать вам некоторую информацию.
Как уже говорилось в вашем связанном обсуждении, расширение служебных классов - это плохая практика. Изменение в версии 4, вероятно, направлено на это соглашение.
Расширение служебных классов (только со статическими методами) не имеет смысла, так как вы не можете переписать статические методы в любом случае. Вы можете, однако, скрыть их. Это означает, что это может произойти случайно с непреднамеренным поведением. Так что это риск без реальной ценности. Это на самом деле не делает ваш код более сложным, если вы просто используете два служебных класса. Там даже есть предупреждение компилятора за то, что он не обращается напрямую к статическим методам.
Каковы рекомендации по расширению служебных классов для добавления пользовательских / определенных служебных методов?
Подводя итог: лучше всего не расширять их, а использовать второй пользовательский класс утилит.