あまり知られていないJava機能。 第二部

約束されたように、次の5つの点に注目します。



あまり知られていないJava機能。 前編



6.名前の競合。



異なるパッケージから同じ名前の複数のクラスをインポートすると、名前の競合が発生します。 この場合、クラスを参照するときは、その修飾名、つまりパッケージの名前を含む完全な名前、たとえばjava.langを示す必要がありますひも



あなたはそれについて何もできないのですか? それはあなたができることが判明しました。 Listクラスがjava.awtパッケージとjava.utilパッケージの両方に存在するという事実にもかかわらず、次のコードは問題なくコンパイルされます。



import java.awt.*; import java.util.*; import java.util.List; public class  { public static void main(String... ) { List  = Collections.emptyList(); System.out.println(); } }
      
      







必要なクラス、この例ではjava.util.Listをインポートするだけで十分です。



ここでは、お気付きのとおり、キリル文字の識別子が使用されています。 はい! 一部の人にとっては啓示になりますが、Java ...そのようなJavaです。 識別子は、数字、アンダースコア、および米国通貨に加えて、絶対に任意の文字で構成できます(ただし、最後の文字($)はお勧めできません。システムのニーズに対応しています)。 しかし、私たちはそれを必要としますか? 難読化の目的でない限り。 英語、ロシア語、ギリシャ語のアルファベットの「A」文字から生成できるさまざまな識別子を想像してください...







7.コレクションの初期化。



コレクションの初期化を簡素化し、コードの認識を容易にするために、どのようなトリックを使用する必要はありません。 SDKの5番目のバージョンに登場したメソッドの可変引数varargs )と、標準APIの開発者による注意深い更新のおかげで、状況は少し良くなりました。



 List<Integer> theNumbers = new LinkedList<Integer>(); Collections.addAll(theNumbers, 4, 8, 15, 16, 23, 42);
      
      







しかし、このコードは1行ではなく2行を使用し、論理的に関連しているようには見えません。 Googleコレクションなどのサードパーティのライブラリを使用したり、独自の自転車を発明したりできますが、より適切なオプションがあります。



 List<Integer> theNumbers = new LinkedList<Integer>(Arrays.asList(4, 8, 15, 16, 23, 42));
      
      







また、同じバージョンのJavaで静的インポートが出現すると、この構成をもう1語短くすることができます。



 import static java.util.Arrays.*; // ... List<Integer> theNumbers = new LinkedList<Integer>(asList(4, 8, 15, 16, 23, 42));
      
      







ただし、コレクション内の要素の数が変わらない場合、次のように簡単に記述できます。



 import static java.util.Arrays.*; // ... List<Integer> theNumbers = asList(4, 8, 15, 16, 23, 42);
      
      







これらのトリックを使用すると、収集インターフェイスの収集相続人を初期化できますが、残念ながらこれはカードでは機能しません。 解決策はありますが、記事の前の部分をご覧ください。



8.サブスクリプション。



特にArrayListとLinkedListの継承元であるjava.util.Listインターフェイスには、List.subList()という素晴らしいメソッドがあります。 見た目では新しいリストではなく、このメソッドが呼び出されリストのビューを返すため、両方のリストが保存されたアイテムを分離します。 これから、優れた特性が続きます。



 someList.subList(3, 7).clear();
      
      







この例では、3番目から7番目までの4つの要素(包括的ではない)がsomeListのリストから削除されます。



サブリストは、非常に強力なプログラミングのイディオムである範囲として使用できます。 たとえば、最初または最後の要素を除いて、コレクションをどのくらいの頻度で移動する必要がありましたか? Foreachはさらに強力になりました。



 import static java.util.Arrays.*; // ... List<Integer> theNumbers = asList(4, 8, 15, 16, 23, 42); int size = theNumbers.size(); for (Integer number : theNumbers.subList(0, size - 1)) { System.out.print(number + ", "); } System.out.println(theNumbers.get(size - 1));
      
      







サブリストは、本質から生じる機能のため、注意して使用する必要があります(詳細についてはドキュメントを参照してください)。



9.カフェベイビー。



コンパイルされたすべてのクラスとインターフェースは、拡張子が.classの特別なファイルに保存されます。 Java仮想マシンによって解釈されるバイトコードが含まれています。 これらのファイルをすばやく認識するために、最初の4バイトに、16進数で0x CAFEBABEのようなラベルが含まれています。



まあ、最初の言葉ですべてが明確です-あなたが知っているように、Javaは熱帯の島にちなんで命名されませんでしたが、同じ名前のコーヒー、および16進数システムで使用される文字の中で、文字「J」と「V」は見つかりませんでした しかし、開発者を導き、2番目の単語を発明したのは、推測しかできません:)



10.例外的な状況。



そして最後に、小さなコード:



 try { throw null; } finally { return; }
      
      







NullPointerExceptionをスローし、...迷子になり、跡形もなく消えます! 警戒してください。



All Articles