Sun独自のJavaクラスを使用すると、コンパイラは警告を表示します。私は、これらのクラスを使用することは一般的に悪い考えだと思います。私はこれをどこかで読んだ。ただし、警告以外に、警告を使用しない基本的な理由はありますか?
7 に答える
それらは内部 API であるため、文書化されていない、またはサポートされていない方法で変更される可能性があり、特定の JRE/JDK (あなたの場合はSun ) にバインドされているため、プログラムの移植性が制限されます。
そのような API の使用を避けるようにしてください。公開され、指定されたクラスを常に優先してください。
JDK 6 ドキュメントには、 Note About sun.*
Packagesというタイトルのリンクが含まれています。これは Java 1.2 docs のドキュメントであるため、への参照は次のsun.*
ように扱われるべきです。com.sun.*
それからの最も重要なポイントは次のとおりです。
Sun が Java 2 SDK, Standard Edition に同梱するクラスは、パッケージ グループ
java.*
、javax.*
、org.*
およびに分類されますsun.*
。パッケージ以外はすべてsun.*
Java プラットフォームの標準部分であり、将来的にサポートされる予定です。一般に、Java プラットフォームの外部にある などのパッケージsun.*
は、OS プラットフォーム (Solaris、Windows、Linux、Macintosh など) によって異なる可能性があり、SDK バージョン (1.2、1.2.1) で通知なしにいつでも変更される可能性があります。 、1.2.3など)。パッケージへの直接呼び出しを含むプログラムは、sun.*
100% Pure Java ではありません。
と
Java プラットフォームを実装する各企業は、独自の方法で実装します。のクラス
sun.*
は、Java プラットフォームの Sun 実装をサポートするために SDK に存在します。これらのsun.*
クラスは、Java プラットフォーム クラスを Sun Java 2 SDK の「内部」で動作させるものです。これらのクラスは、通常、別のベンダーの Java プラットフォームには存在しません。Java プログラムがクラス「sun.package.Foo」を名前で要求すると、ClassNotFoundError で失敗する可能性があり、Java で開発する大きな利点が失われます。
Sun 以外の JVM でコードを実行してみて、何が起こるかを確認してください...
(コードは ClassNotFound 例外で失敗します)
はい。これらのクラスまたは API が次の Java リリースと同じであることを保証する人は誰もいませんし、これらのクラスが他のベンダーの Java バージョンで利用できることも保証されていないに違いありません。
したがって、コードを特別な Java バージョンに結合すると、少なくとも移植性が失われます。
Sun 独自の Java クラスは、Java API の一部ではなく、Java 実装の一部であり、その使用法は文書化されておらず、サポートもされていません。これらは内部的なものであるため、Sun JVM を扱うチームが決定する理由に関係なく、いつでも変更できます。
また、Sun の Java 実装だけが存在するわけではありません。コードは、Oracle/BEA や IBM などの他のベンダーの JVM に移植できません。
オラクルの回答は次のとおりです。開発者が「sun」パッケージを呼び出すプログラムを作成すべきではない理由
私は最近、これらのクラスを使用するときに発生する可能性のある現実世界の問題を示したケースを持っていました: sun.* クラスで使用されていたメソッドが Ubuntu の OpenJDK に存在しなかったためにコンパイルされないコードがありました。したがって、これらのクラスを使用する場合、特定の Java 実装でのみ機能するため、「これは Java 5 で機能する」などと言うことができなくなると思います。