Это плохая практика использовать проприетарные 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.
Вот ответ Oracle: почему разработчики не должны писать программы, которые называют "солнечными" пакетами
Недавно у меня был случай, в котором была обнаружена реальная проблема, с которой вы можете столкнуться при использовании этих классов: у нас был код, который не компилируется, потому что метод, который он использовал в классе sun.*, Просто не существовал в OpenJDK в Ubuntu. Поэтому я думаю, что при использовании этих классов вы больше не можете говорить такие вещи, как "это работает с Java 5", потому что это будет работать только в определенной реализации Java.