web-dev-qa-db-ja.com

Java:パッケージ内のクラスにアクセスします。これはより良い方法ですか?

インポートせずに完全修飾名を使用してパッケージ内のクラスにアクセスする場合、メモリを節約できますか?

完全修飾クラス名の使用:

Java.lang.Math.sqrt(x);

パッケージのインポート:

import Java.lang.Math;

Math.sqrt(x);

どちらがより良い方法です:パッケージをインポートするか、完全修飾名を使用してアクセスしますか?

ありがとう。

13
Jomia

パッケージのインポートと完全修飾クラス名の使用の間にパフォーマンスの違いはありません。インポートディレクティブはJavaバイトコードに変換されないため、ランタイムのパフォーマンスに影響はありません。唯一の違いは、インポートしたクラスを複数回使用する場合に時間を節約できることです。良い読み物です here

12
Piyush Mattoo

いいえ、メモリを節約しません。

また、Mathをまったくインポートする必要がないことに注意してください。 Java.langのすべてが自動的にインポートされます。

より良い例はArrayListのようなものです

import Java.util.ArrayList;
....
ArrayList<String> i = new ArrayList<String>();

ArrayListを具体的にインポートしています。できたかもしれない

import Java.util.*; 

ただし、通常は、パッケージ間の衝突の問題を回避するために、大規模なワイルドカードのインポートを避けたいと考えています。

7
Brian Roach

それらは同等です。アクセスは同じです。

インポートは、毎回完全に解決されたクラス名を入力する必要がないようにするための単なる規則です。速いタッチタイパーであれば、インポートを使用せずにすべてのJavaと書くことができます。

しかし、効率やクラスの読み込みに違いはありません。

4
duffymo

既に述べたように、実行時には違いはなく(クラスファイルでは常に完全に修飾され、クラスをロードおよびリンクした後、参照されるメソッドへの直接ポインターがあります)、Java.langパッケージのすべてが自動的に現在のパッケージのすべてと同様にインポートされます。

コンパイラーは数マイクロ秒長く検索する必要があるかもしれませんが、これは理由ではないはずです-人間の読みやすいように判断してください。

ところで、多くの静的メソッドを使用している場合(たとえば、Mathから)、次のように書くこともできます。

import static Java.lang.Math.*;

そして使用する

sqrt(x)

直接。ただし、これはクラスが数学に重く、リーダー(コンパイラとして)が最初に同じクラスで、おそらくスーパークラスでも検索するため、より大きな式の読みやすさに本当に役立つ場合にのみ行ってください。 (これは、他の静的メソッドと静的変数(または定数)にも同様に適用されます。)

2
Paŭlo Ebermann

インポートパッケージは読みやすくするためのものです。

特別なシナリオでは、完全修飾クラスを使用する必要があります。たとえば、異なるパッケージの同じクラス名、またはClass.forName()などのReflectを使用します。