给 Pet 对象一个唯一的主键。整数 ID 字段很流行,非常高效且足以处理除最大交易量之外的所有交易。
然后,您可以维护一个 Map 并通过 ID 有效地获取 Pets。这种模式可以在整个模型中使用。
对于由 SQL 数据库支持的商业应用程序,也使用类似的模式——但检索是通过 Hibernate 完成的。
简单的例子:
public class Player {
protected List<Pet> petList = new ArrayList();
protected Map<Integer,Pet> petMap = new HashMap();
public List<Pet> getPets() {return petList;}
public Pet getPetById (int id) {return petMap.get( id);}
public void addPet (Pet pet) {
petList.add( pet);
petMap.put( pet.getId(), pet);
}
}
public class Pet {
protected int id;
// Id;
public int getId() {return id;}
// create; static factory.
//
public static Pet createPet() {
Pet pet = new Pet();
pet.id = KeyAllocator.alloc("pet");
return pet;
}
}
提示:您可以使用 LinkedHashMap 来保留 Pets 的顺序,而不必同时保留 List;但是它将 getPets() 返回类型从 List 更改为 Collection,这有点不太好。
KeyAllocator.alloc() 使您能够重用分配逻辑;基本上它应该从 1 开始并在“同步”块内递增。(避免使用 0,因为如果您曾经使用持久层存储数据,0 往往意味着“新”。)