Плохая практика использования собственных Java-classов Sun?

Предупреждение о компиляторе отображает предупреждения, если вы используете собственные classы Java Sun. Я считаю, что использовать эти classы в целом неплохо. Я читал это где-то. Однако, помимо предупреждений, есть ли какие-либо фундаментальные причины, почему вы не должны их использовать?

    Поскольку они являются внутренними API-интерфейсами: они могут быть изменены бездокументарным или неподдерживаемым образом, и они привязаны к определенному JRE / JDK ( Sun в вашем случае), что ограничивает переносимость ваших программ.

    Старайтесь избегать использования таких API-интерфейсов, всегда предпочитайте общеansible документированный и заданный class.

    Документация JDK 6 включает ссылку « Примечание о sun.* Пакеты . Это документ из документов Java 1.2, поэтому ссылки на sun.* Следует рассматривать так, как если бы они сказали com.sun.*

    Наиболее важными из них являются:

    Классы, которые Sun включает в себя с Java 2 SDK, Standard Edition, попадают в группы пакетов java.* , javax.* , org.* И sun.* . Все, кроме sun.* Пакеты являются стандартной частью платформы Java и будут поддерживаться в будущем. В общем, такие пакеты, как sun.* , Которые находятся за пределами платформы Java, могут быть разными на платформах ОС (Solaris, Windows, Linux, Macintosh и т. Д.) И могут быть изменены в любое время без уведомления с версиями SDK (1.2, 1.2.1, 1.2.3 и т. Д.). Программы, содержащие прямые вызовы на sun.* Пакеты не являются 100% чистой Java.

    а также

    Каждая компания, которая реализует платформу Java, будет делать это по-своему. Классы на sun.* Присутствуют в SDK для поддержки реализации Sun платформы Java: classы sun.* – это то, что делает classы платформы Java «под прикрытием» для Sun Java 2 SDK. Эти classы вообще не будут присутствовать на платформе Java другого поставщика. Если ваша Java-программа запрашивает class sun.package.Foo по имени, она может завершиться неудачей с ClassNotFoundError, и вы потеряете главное преимущество разработки на Java.

    Попробуйте запустить код с помощью JVM, отличного от Sun, и посмотрите, что произойдет …

    (Ваш код не будет работать с исключением ClassNotFound)

    Да, потому что никто не гарантирует, что эти classы или API будут одинаковыми со следующей версией Java, и я уверен, что не гарантировано, что эти classы доступны в версиях Java от других поставщиков.

    Таким образом, вы связываете свой код с специальной версией Java и теряете хотя бы переносимость.

    Собственные Java-classы Sun являются частью их реализации Java, не являющейся частью Java API, использование которых недокументировано и неподдерживается. Поскольку они являются внутренними, они могут быть изменены в любое время по любой причине, которую решает команда, работающая с Sun JVM.

    Кроме того, реализация Java Sun не является единственной! Ваш код не сможет переноситься в JVM от других поставщиков, таких как Oracle / BEA и IBM.

    Вот ответ Oracle: почему разработчики не должны писать программы, которые называют «sun» Packages

    Недавно у меня был случай, который показал реальную проблему, с которой вы можете столкнуться, когда используете эти classы: у нас был код, который бы не компилировался, потому что метод, который он использовал на солнце. * Класс просто не существовал в OpenJDK на Ubuntu. Поэтому я предполагаю, что при использовании этих classов вы больше не можете говорить такие вещи, как «это работает с Java 5», потому что он будет работать только на определенной реализации Java.

    Давайте будем гением компьютера.