Javaの可変クラス(キャッシュインスタンス)
4206 ワード
不変クラス
可変クラスとは、クラスのインスタンスを作成した後、インスタンスのインスタンス変数を変更できないことを意味します.Java提
次のようになります.
カスタム可変クラスを作成する必要がある場合は、次のルールがあります.は、 を修飾する.は、入力パラメータに基づいてクラス内のメンバー変数 を初期化するためのパラメータ付きコンストラクタを提供する.は、 を必要としない.
次に、
キャッシュ・インスタンスの可変クラス
可変クラスのインスタンスステータスは変更できません.複数のオブジェクトによって容易に共有できます.プログラムが常に同じ可変インスタンスを使用する必要がある場合は、このような可変インスタンスをキャッシュすることを考慮します.
テストクラス:
Javaが提供する
可変クラスとは、クラスのインスタンスを作成した後、インスタンスのインスタンス変数を変更できないことを意味します.Java提
java.lang.String
クラスはいずれも可変クラスであり、それらのインスタンスを作成すると、インスタンスのインスタンス変数も変更できません.次のようになります.
Double d = new Double(2.2);
String str = new String("cuzz");
カスタム可変クラスを作成する必要がある場合は、次のルールがあります.
private
およびfinal
の修飾子を使用してクラスのメンバー変数getter
の方法を提供する、setter
の方法次に、
Adress
クラスを定義します.プログラムはAddress
クラスのdetailとpostCodeメンバー変数をprivateで隠し、finalを使用して2つのメンバー変数を修飾します.この2つのメンバー変数の値を他の方法で変更することはできません.public class Address {
private final String detail;
private final String postCode;
//
public Address() {
this.detail = "";
this.postCode = "";
}
public Address(String detail, String postCode) {
this.detail = detail;
this.postCode = postCode;
}
// getter
public String getDetail() {
return this.detail;
}
public String getPostCode() {
return this.postCode;
}
// equeal
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj != null && obj.getClass() == Address.class) {
Address address = (Address) obj;
// detail postCode
if (address.detail == detail && address.postCode == postCode) {
return true;
}
}
return false;
}
public int hashCode() {
return detail.hashCode() + postCode.hashCode() * 31;
}
}
キャッシュ・インスタンスの可変クラス
可変クラスのインスタンスステータスは変更できません.複数のオブジェクトによって容易に共有できます.プログラムが常に同じ可変インスタンスを使用する必要がある場合は、このような可変インスタンスをキャッシュすることを考慮します.
public class CacheImmutable {
private static int MAX_SIZE = 10;
//
private static CacheImmutable[] cache = new CacheImmutable[MAX_SIZE];
// cache[pos-1]
private static int pos = 0;
private final String name;
private CacheImmutable(String name) {
this.name = name;
}
private String getName() {
return name;
}
public static CacheImmutable valueOf(String name) {
//
for (int i = 0; i < MAX_SIZE; i++) {
//
if (cache[i] != null && cache[i].getName().equals(name)) {
return cache[i];
}
}
//
if (pos == MAX_SIZE) {
//
pos = 0;
cache[pos++] = new CacheImmutable(name);
}else {
cache[pos++] = new CacheImmutable(name);
}
return cache[pos-1];
}
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj != null && obj.getClass() == CacheImmutable.class) {
CacheImmutable ci = (CacheImmutable) obj;
return name.equals(ci.getName());
}
return false;
}
}
テストクラス:
public class CacheImmutableTest {
public static void main(String[] args) {
CacheImmutable c1 = CacheImmutable.valueOf("cuzz");
CacheImmutable c2 = CacheImmutable.valueOf("cuzz");
System.out.println(c1 == c2 ); // true
}
}
Javaが提供する
java.lang.Integer
クラスと同じポリシーpublic class IntegerCacheTest {
public static void main(String[] args) {
// Integer
Integer in1 = new Integer(6);
// Integer
Integer in2 = Integer.valueOf(6);
// Integer
Integer in3 = Integer.valueOf(6);
System.out.println(in1 == in2); // false
System.out.println(in2 == in3); // true
// Integer -128~127
Integer in4 = Integer.valueOf(200);
Integer in5 = Integer.valueOf(200);
System.out.println(in4 == in5); // false
}
}