Если разработчик расширяет класс Java, который является частью JDK, и добавляет к нему новые методы, всегда существует риск того, что будущая версия Java может ввести методы с тем же именем/сигнатурой, что приведет к нежелательному поведению, если программа будет выполняться с эти будущие версии. Поскольку нет доступной аннотации «Не переопределения» (см. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7152222), которые обнаруживали бы такие возможные проблемы, когда кто-то компилирует код с более новой версией JDK, разработчик должен сделать эту проверку другим способом. Какой подход вы используете?
Какой подход использовать в собственных программах для обновления будущих версий Java?
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
+1 - Не существует перспективного способа расширения классов, которые не предназначены для расширения. Лучший подход? Только не делай этого вообще!
- person Stephen C; 29.04.2013
Конкретным классом JDK был java.awt.Window, конкретным методом был getType(). В целом я бы с вами согласился, но в этом особом случае я думаю, что расширение класса Window было единственной возможностью.
- person mschenk74; 29.04.2013
@ mschenk74 Поскольку
Window
является основой полной иерархии классов контейнеров с графическим интерфейсом, я не понимаю, как вы добьетесь чего-либо, даже если сделаете его подклассом: все остальные JDK все равно будут продолжать расширяться от Window
, а не от вашего пользовательский подкласс.
- person Marko Topolnik; 29.04.2013
Хорошо, мой текст был немного краток: я имел в виду: мы создали подкласс одного из классов GUI (назовем его ClassX), который сам является потомком java.awt.Window. А затем новый метод getType() в Window вызвал проблемы. Мы не хотели менять класс JDK Window, мы хотели только иметь возможность использовать наш класс в тех местах, где JDK ожидает ClassX.
- person mschenk74; 29.04.2013
Наследование — мощная техника, но из-за недостатка знаний она может быть хуже. Итак, в этом случае вы должны использовать композицию вместо наследования. Создайте класс, содержащий объект любого класса Java, который вы хотите расширить, а затем расширите класс до этого вновь созданного класса вместо исходного класса.
person
Waqas Ali
schedule
29.04.2013