Javaの可変クラス(キャッシュインスタンス)

4206 ワード

不変クラス
可変クラスとは、クラスのインスタンスを作成した後、インスタンスのインスタンス変数を変更できないことを意味します.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
        }
    }