ファーストを避けたいのですが、反復なしで同じ構文解析されたデカルトの点を、持っているものを見つけることができないため、...
を覚えています「早期の最適化がすべての悪の根源である、時間の約97%という小規模な効率性を忘れるべきです。
したがって、がこの最適化を可能にすることで、このような方法であなたの運動Vectorクラスを設計するのが賢明だろうが、物事はかなり機能的になるまでそれを実装し、実際に遅らせます。
つまり、それは難しいことではありません(ユニットテストでは、最適化によってバグが導入されないことが保証されています)。最も簡単な方法は、Map<Integer, Map<Integer, A>>
またはMap<String, A>
のいずれかを使用することです。ここで、A
は移動ベクトルクラスです。あなたはそのように実現することができます。
public class MovementVector {
private static Map<String, MovementVector> cache = new HashMap<>();
//Step 0 : all fields must be immutable, or instance sharing will backfire catastrophically
public final int r;
public final int c;
//Step 1 : make constructor(s) private so new instances can't be created without your knowledge
private MovementVector(int r, int c) {
this.r = r;
this.c = c;
}
public String toString() {
return makeString(r, c);
}
//Step 2 : single method that makes keys for a given r,c.
// Must be static so it can be used in get(..) below.
private static String makeString(int r, int c) {
return "(" + r + "," + c + ")";
}
public boolean equals(Object o) {
if (! (o instanceof MovementVector)) return false;
MovementVector m = (MovementVector)o;
return r == m.r && c == m.c;
}
public int hashCode() {
return r * 10 + c;
}
//Step 3 : public static getter that functions as constructor/instance retriever
public static MovementVector get(int r, int c) {
String str = makeString(r,c);
MovementVector vectorFromCache = cache.get(str);
if (vectorFromCache != null) return vectorFromCache;
else {
MovementVector v = new MovementVector(r,c);
cache.put(str, v);
return v;
}
}
}
と使用方法:
MovementVector pawnMovement = MovementVector.get(0,1);
MovementVector pawnMovement2 = MovementVector.get(0,1);
//pawnMovement == pawnMovement2