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

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

7 ответов

Решение

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

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

Документация 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: sun.* классы - это то, что заставляет классы платформы Java работать "под прикрытием" для Sun Java 2 SDK. Эти классы, как правило, не будут присутствовать на платформе Java другого поставщика. Если ваша Java-программа запрашивает класс "sun.package.Foo" по имени, она может потерпеть неудачу с ClassNotFoundError, и вы потеряете основное преимущество разработки на Java.

Попробуйте запустить свой код с не-Sun JVM и посмотрите, что произойдет...

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

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

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

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

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

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

Другие вопросы по тегам