最近、私は声明に出くわしました:
import static java.lang.System.out;
import static java.lang.System.exit;
私はいくつかのチュートリアルでこれらのステートメントを読みました。これらのステートメントは大丈夫ですか?
ステートメントが問題ない場合、それらは何を意味し、コードを書くときに定期的に使用する必要がありますか?
最近、私は声明に出くわしました:
import static java.lang.System.out;
import static java.lang.System.exit;
私はいくつかのチュートリアルでこれらのステートメントを読みました。これらのステートメントは大丈夫ですか?
ステートメントが問題ない場合、それらは何を意味し、コードを書くときに定期的に使用する必要がありますか?
それらは静的インポートと呼ばれます。その効果は、現在のスコープで定義されているかのように、名前out
とプログラムで使用できるようにすることです。したがって、の代わりにexit
書くことができます。exit(0)
System.exit(0)
さて、彼らは良い考えですか?時々、控えめに使用するとき、それらは混乱を減らすための良い方法です。しかし、ほとんどの場合、実際にはコードが理解しにくくなります。読者は「これはどこでout
定義されているのか」と尋ねます。と「どこexit()
から来たの?」一般的に、あなたはそれらを避けるべきです。
しかし、オブジェクトの処理に関するすべてのクラスを作成していて、大量のSomeReallyLongName
オブジェクトをSomeReallyLongName
定義しているFINAL_CONSTANTS
場合、静的インポートを使用してオブジェクトをインポートすると、多くの入力と煩雑さが軽減され、これらの定数がどこから来ているのかがかなり明確になります。
それらは静的インポートです。exit(0)
の代わりに次のようなことができますSystem.exit(0)
。
一部の人を混乱させる可能性があるため、よく知られているJavaクラスにはお勧めしません。ただし、 Guavaなどのユーティリティクラスに役立つ場合もあります。
Iterables.filter(list, SomeClass.class)
非常に冗長ですが、静的インポートを使用して読みやすくすることができます。filter(list, SomeClass.class)
チームがコードガイドラインを確認し、一貫性を保つように努める必要があります。
はい、それは完全に大丈夫です。
これは、として知られていstatic import
ます。これにより、クラスで定義されたメンバーを、フィールドが定義されているクラスを指定static
せ
public
ずに使用できます。この機能はで定義されましたJ2SE 5.0
。例えば :
import static java.lang.Math.*;
import static java.lang.System.out;
// in main
out.print( max(100,200) ); // prints 200.You didn't have to use Math.max(.,.)
コードが読みにくくなるため、静的インポートを使用することはお勧めできません。
はい、これらのステートメントはと呼ばれstatic imports
、完全に有効です。詳細については、静的インポートに関するjavaseガイドを参照してください。
使用法に関して、ガイドは次のように述べています。
では、いつ静的インポートを使用する必要がありますか?非常に控えめに!定数のローカルコピーを宣言したり、継承(定数インターフェイスアンチパターン)を悪用したりする場合にのみ使用してください。つまり、1つまたは2つのクラスの静的メンバーに頻繁にアクセスする必要がある場合に使用します。静的インポート機能を使いすぎると、プログラムが読み取れなくなり、保守できなくなり、インポートしたすべての静的メンバーで名前空間が汚染される可能性があります。あなたのコードの読者(あなたがそれを書いた数ヶ月後のあなたを含む)は、静的メンバーがどのクラスから来ているのかわかりません。クラスからすべての静的メンバーをインポートすると、読みやすさが特に損なわれる可能性があります。1つまたは2つのメンバーのみが必要な場合は、それらを個別にインポートします。適切に使用すると、静的インポートによってプログラムが読みやすくなります。
静的インポート構造により、静的メンバーを含む型から継承することなく、静的メンバーへの非修飾アクセスが可能になります。代わりに、プログラムはメンバーを個別にインポートします
out
たとえば、簡単にアクセスしてexit
直接呼び出すことができるようにしたい場合は、例に問題はありませんout.println()
。「紛らわしく」、どこから来たのか理解するのが難しいと主張する人もいるかもしれませんが、構文的にもスタイルの観点からも間違っていることはありませんout
が、最新のIDEならどれでもそれを理解するのに役立ちます。
これらは静的インポートの概念です。これらは単純なインポートに似ていますが、概念のタイプが異なります。ここでは、1つの関数exit()と1つのフィールドをインポートし、対応するクラスで両方とも静的です(ここで両方がSystenのクラスである場合)。この後、System.out.println()を書き込む代わりに、単にout.println()を書き込むことができます。同様に、 System.exit()の代わりに、 exit ( )を書き込むことができます。