スレッドのセキュリティを実現するためのいくつかの方法


JDK1.5新機能
 
「JDK 1.5」の重要なテーマは、汎用、for-eachサイクル、自動梱包/解体、列挙、可変パラメータ、静的インポートなど、いくつかの特性を追加することによって開発を簡素化することです.これらの特性を使用すると、より明確で、精悍で、安全なコードを書くのに役立ちます. 
 
これらの新しい特性を簡単に紹介します. 
1.汎用(General)
C++はテンプレート技術によって集合の要素タイプを指定することができ、Javaは1.5まで対応する機能を持っていなかった.1つの集合には任意のタイプのオブジェクトを置くことができ、それに応じて集合からオブジェクトを取るときには、強制的にタイプ変換を行わなければなりません.猛虎は汎用型を導入し、集合内の要素のタイプを指定することで、コンパイル時にタイプチェックを行う強いタイプのメリットを得ることができます. 
 
Collection c = new ArrayList(); 
c.add(new Date()); 

 
 
コンパイラでエラーが発生します.
add(java.lang.String) in java.util.Collection cannot be applied to (java.util.Date) 
2.For-EAchサイクル
For-EAchループは,集合の遍歴を簡略化するために加えられる.1つの集合を巡って要素をいくつか処理するとします.一般的なコードは次のとおりです.
 
void processAll(Collection c){ 
for(Iterator i=c.iterator(); i.hasNext();){ 
MyClass myObject = (MyClass)i.next(); 
myObject.process(); 
} 
} 

 
 
For-EAchループを使用すると、コードを書き換えることができます.
void processAll(Collection c){ 
 
for (MyClass myObject :c) 
myObject.process(); 
} 

 
 
このコードは、上記よりも明確であり、強制タイプ変換を回避します. 
 
3.自動梱包/解体(Autoboxing/unboxing)
自動梱包/解体は、基本タイプのデータとパッケージクラスでの使用を大幅に便利にします. 
自動梱包:基本タイプは自動的に包装類に転換する.(int >> Integer) 
自動梱包:包装類が自動的に基本タイプに移行する.(Integer >> int) 
JDK 1.5以前、私たちはいつも集合に基本的なタイプを保存できないことを心配していましたが、今では自動変換メカニズムが私たちの問題を解決しました. 
int a = 3; 
Collection c = new ArrayList(); 
c.add(a);//     Integer. 
Integer b = new Integer(2); 
c.add(b + 2); 

 
 
ここでIntegerは、まずintに自動的に変換する加算演算を行い、その後intは再びIntegerに変換する. 
 
4.列挙(Enums)
JDK1.5新しいタイプのクラス-列挙タイプが追加されました.このためJDK 1.5新しいキーワードenmuを導入しました.このように列挙タイプを定義することができます. 
 
public enum Color 
{ 
Red, 
White, 
Blue 
} 

 
このようにしてColor myColor=Colorを使用することができる.Red. 
列挙タイプはまた2つの有用な静的方法values()とvalueOf()を提供した.私たちはそれらを簡単に使用することができます.例えば、
for (Color c : Color.values()) 
System.out.println(c); 

 
 
5.可変パラメータ(Varargs)
可変パラメータを使用すると、プログラマは可変数パラメータを受け入れる方法を宣言できます.可変パラメータは、関数宣言の最後のパラメータでなければなりません.簡単な方法でいくつかのオブジェクトを印刷するとします.
util.write(obj1); 
util.write(obj1,obj2); 
util.write(obj1,obj2,obj3); 

 
… 
JDK 1.5以前は、リロードで実現できましたが、これでは多くのリロード関数を書く必要があり、あまり効果的ではありません.可変パラメータを使用する場合は、関数を1つだけ必要とします.
public void write(Object... objs) { 
for (Object obj: objs) 
System.out.println(obj); 
} 

 
可変パラメータを導入すると、Javaの反射パケットもより使いやすくなります.c.getMethod("test",new Object[0]).invoke(c.newInstance(), new Object[0])), 
これでc.getMethod(「test」)と書くことができます.invoke(c.newInstance()は、このようなコードが元よりずっとはっきりしています. 
 
6.静的インポート(Static Imports)
静的メンバー(メソッドと変数)を使用するには、このメソッドを提供するクラスを指定する必要があります.静的インポートを使用すると、インポートされたクラスのすべての静的変数と静的メソッドが現在のクラスで直接表示され、これらの静的メンバーを使用してクラス名を指定する必要はありません.
import static java.lang.Math.*; 
……. 

 
r = sin(PI * 2);//r=Mathと書く必要はありません.sin(Math.PI); 
しかし、この特性を過度に使用すると、コードの可読性もある程度低下する.