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

Трудно сказать, как определенная JVM реализует экземпляр, но в большинстве случаев, Объекты сопоставимы со структурами, и классы также, и каждая объектная структура имеет указатель на структура класса, из которой это является экземпляр. Таким образом, на самом деле instanceof для

if (o instanceof java.lang.String)

мог бы быть с такой скоростью, как следующий код C

if (objectStruct->iAmInstanceOf == &java_lang_String_class)

предположение, что JIT-компилятор существует и делает достойное задание.

Рассмотрение, что это только получает доступ к указателю, получая указатель при определенном смещении указатель, указывает на и сравнивая это с другим указателем (который является в основном тем же как тестирующий к числам на 32 бита, являющимся равным), я сказал бы, что операция может на самом деле быть очень быстрой.

Это не имеет к, тем не менее, это во многом зависит от JVM. Однако, если бы это оказалось бы операцией узкого места в Вашем коде, я считал бы реализацию JVM довольно плохой. Даже тот, который не имеет никакого JIT-компилятора и только интерпретирует код, должен быть в состоянии сделать тест instanceof в фактически никакое время.

26
задан Peter Mortensen 2 December 2009 в 20:25
поделиться

6 ответов

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

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

54
ответ дан 28 November 2019 в 06:06
поделиться

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

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

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

и

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

22
ответ дан 28 November 2019 в 06:06
поделиться

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

(Ваш код завершится ошибкой с исключением ClassNotFound)

9
ответ дан 28 November 2019 в 06:06
поделиться

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

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

7
ответ дан 28 November 2019 в 06:06
поделиться

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

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

4
ответ дан 28 November 2019 в 06:06
поделиться

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

1
ответ дан 28 November 2019 в 06:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: