Какой подход использовать в собственных программах для обновления будущих версий Java?

Если разработчик расширяет класс Java, который является частью JDK, и добавляет к нему новые методы, всегда существует риск того, что будущая версия Java может ввести методы с тем же именем/сигнатурой, что приведет к нежелательному поведению, если программа будет выполняться с эти будущие версии. Поскольку нет доступной аннотации «Не переопределения» (см. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7152222), которые обнаруживали бы такие возможные проблемы, когда кто-то компилирует код с более новой версией JDK, разработчик должен сделать эту проверку другим способом. Какой подход вы используете?


person mschenk74    schedule 29.04.2013    source источник
comment
Какой класс Java вы хотите расширить? Может быть, есть какой-то совет по этому поводу, если вы можете больше указать вариант использования.   -  person vikingsteve    schedule 29.04.2013
comment
Проблема возникла при переходе с JDK6 на JDK7, где метод getType() был введен в JDK7. У нас было несколько классов в нашем коде, расширяющем java.awt.Window, у которого уже был метод getType().   -  person mschenk74    schedule 29.04.2013


Ответы (2)


Это антипаттерн для расширения классов JDK, за исключением тех, которые специально разработаны для использования путем их расширения. Вместо этого для добавления функций в классы JDK следует использовать шаблон Decorator. JDK также не является особым случаем, это справедливо и для любых сторонних библиотек.

person Marko Topolnik    schedule 29.04.2013
comment
+1 - Не существует перспективного способа расширения классов, которые не предназначены для расширения. Лучший подход? Только не делай этого вообще! - person Stephen C; 29.04.2013
comment
Конкретным классом JDK был java.awt.Window, конкретным методом был getType(). В целом я бы с вами согласился, но в этом особом случае я думаю, что расширение класса Window было единственной возможностью. - person mschenk74; 29.04.2013
comment
@ mschenk74 Поскольку Window является основой полной иерархии классов контейнеров с графическим интерфейсом, я не понимаю, как вы добьетесь чего-либо, даже если сделаете его подклассом: все остальные JDK все равно будут продолжать расширяться от Window, а не от вашего пользовательский подкласс. - person Marko Topolnik; 29.04.2013
comment
Хорошо, мой текст был немного краток: я имел в виду: мы создали подкласс одного из классов GUI (назовем его ClassX), который сам является потомком java.awt.Window. А затем новый метод getType() в Window вызвал проблемы. Мы не хотели менять класс JDK Window, мы хотели только иметь возможность использовать наш класс в тех местах, где JDK ожидает ClassX. - person mschenk74; 29.04.2013

Наследование — мощная техника, но из-за недостатка знаний она может быть хуже. Итак, в этом случае вы должны использовать композицию вместо наследования. Создайте класс, содержащий объект любого класса Java, который вы хотите расширить, а затем расширите класс до этого вновь созданного класса вместо исходного класса.

person Waqas Ali    schedule 29.04.2013