オブジェクト指向プログラミング十戒 8 I/Oアクセスは最小限にする


 

8 I/Oアクセスは最小限にする

同じ情報を何度も取得しない。取得するたびに結果が異なるのなら別だが、そうでないなら、結果を保存しておいて2回目以降はその結果を返すようにする。

Customer.java
public class Customer { private String name; private String address; public Customer(int number) { // // DB にアクセスし name、address を設定 // } public String getName() { return name; } public String getAddress() { return address; } }
Process.java
public class Process { public void doProc() { Customer c1 = new Customer(1); Customer c2 = new Customer(25); Customer c3 = new Customer(1); } }

与えられた number をもとにデータベースから情報を取り出すクラス Customer を作成しています。

しかし、同じ number の情報を得るのに、別のインスタンスを生成していて、無駄があります。

Customer.java
public class Customer { private String name; private String address; public Customer(int number) { // // DB にアクセスし name、address を設定 // } public String getName() { return name; } public String getAddress() { return address; } }
CustomerFactory.java
public class CustomerFactory { private HashMap<Integer, Customer> pool = new HashMap<Integer, Customer>(); private static CustomerFactory singleton = new CustomerFactory(); private CustomerFactory() {} public static CustomerFactory getInstance() { return singleton; } public synchronized Customer getCustomer(int number) { Integer no = new Integer(number); Customer c = (Customer)pool.get(no); if (c == null) { c = new Customer(number); pool.put(no, c); } return c; } }
Process.java
public class Process { public void doProc() { CustomerFactory factory =    CustomerFactory.getInstance(); Customer c1 = factory.getCustomer(1); Customer c2 = factory.getCustomer(25); Customer c3 = factory.getCustomer(1); } }

一度生成された Customer のインスタンスは、(この例では、ハッシュテーブル pool に)保存されています。よって、同じ number であれば、この保存されたインスタンスが返されます。