Это плохая практика использовать проприетарные Java-классы Sun? - PullRequest
25 голосов
/ 02 декабря 2009

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

Ответы [ 7 ]

53 голосов
/ 02 декабря 2009

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

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

22 голосов
/ 02 декабря 2009

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

Наиболее важные моменты из этого:

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

9 голосов
/ 02 декабря 2009

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

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

7 голосов
/ 02 декабря 2009

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

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

4 голосов
/ 02 декабря 2009

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

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

2 голосов
1 голос
/ 02 декабря 2009

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

...