我希望对象具有一系列属性和一个唯一标识键。由于密钥是唯一的,因此可用于挑选一组特定的属性。我希望能够在实例化对象时使用该键,以便与该键关联的属性成为该对象的属性。
属性规范将是常规的(即,如果一个键具有名为description的属性,那么每个其他键都是如此)。
这个例子是我试图最初解决问题并且不足的原因。我在这里发布它来说明这种方法的问题。
我可以拥有一个具有名称和描述属性的Food类。在这种情况下,该名称应该是一个唯一的密钥,在这种情况下,只是一个描述。
public class Food {
private String name;
private String description;
public Food(String name, String description) {
this.name = name;
this.description = description;
}
}
首先,每当我创造一种特殊的食物,比如说披萨,我每次都要输入相同的描述,说“一个受欢迎的意大利菜”。我更喜欢的是能够创建一个只知道食物名称的对象,然后为我填写其余的属性。换句话说,我应该能够传递披萨,并且将使用适当的描述创建对象。
其次,此示例没有为name属性保证唯一性。我可以创建一个披萨,其中描述了“一种受欢迎的意大利菜”,另一种则描述了“俗气的善良!”但是,我希望该名称能够唯一地挑选出一组属性。当然属性可以属于多个键(比萨饼和意大利面都可以有“意大利菜”的描述)但是键只能有特定的描述。
我想这至少需要两件事:
将名称与一组属性相关联的某种方式。 HashMap似乎是理想的选择,但在哪里存储它的好位置?将它放在Food类中似乎很奇怪。
一些创建类来处理Food对象的构建(也许这对于上面的HashMap来说是一个很好的位置?)我已经查看了Factory和Builder模式,但Factory似乎是用于创建不同的子类,我希望能够存储1000个不同的项目名称(而不是创建1000个不同的子类)。 Builder似乎用于以更简单的方式指定对象的所有属性,以便在构造函数中记住参数的顺序,同时还保证对象不能被中途实例化,但这似乎几乎与我的相反。我正在寻找。
答案 0 :(得分:1)
Map是存储预定义属性的良好数据结构。但是你需要一个将属性复制到对象的代码,即调用如下代码:
food.setDescription(attrs.get("description"))
此代码可以在工厂编写。 Factory不一定会创建不同类的实例。它可以创建同一个类的实例并启动它们。
其他方法是使用模式命名模板对象。这意味着您可以使用已预定义的属性创建多个对象,如披萨,意大利面,赌注,汤等。然后,当您需要创建另一个披萨时,您首先要创建一个已经存在的披萨的副本,然后修改它以制作您的特定披萨。 java中有多种方法可以创建现有对象的副本:复制构造函数,克隆,序列化等。
答案 1 :(得分:0)
我同意hashmap是理想的,我建议使用某种mapper实用程序类,它将从xml文件或数据库中获取您的名称和描述,然后将它们插入到哈希映射中。这将是您的hashmap所在的位置。然后,您可以使用工厂构建食物对象,并从hashmap中注入名称和描述依赖项。
答案 2 :(得分:0)
您需要一个Factory和一些重载的构造函数。
public class Food {
private static final String DEFAULT_DESCRIPTION = "My favorite!";
private String name;
private String description;
public Food(String name) {
this(name, DEFAULT_DESCRIPTION);
}
public Food(String name, String description) {
this.name = name;
this.description = description;
}
}
class Pizza extends Food {
private static final String DEFAULT_DESCRIPTION = "A popular Italian dish";
public Pizza(String name)
{
super(name, Pizza.DEFAULT_DESCRIPTION);
}
public Pizza(String name, String description) {
super(name, description);
}
}
public class FoodFactory {
private static final FoodFactory instance = new FoodFactory();
private FoodFactory() {}
public static FoodFactory getInstance() { retun this.instance; }
public Food create(String name, String description) {
// Here's where you can create different kinds of food based on your requirements
}
}
答案 3 :(得分:0)
您可以使用ORM框架(如Hibernate)将Java类映射到数据库表,这将负责管理和生成Java类的主键。