这不是关于what is a class
或what is an object
的问题。
我正在尝试确定一种设计模式,以便重复使用。
我有一个班级蓝色印刷品,其中包含一个用字段名称键入的地图和该字段的属性值。此映射值描述特定类的字段。
class FieldDescriptor {
public FieldDescriptor(String name, int length, boolean isKey) {
....
}
...
}
class ConcreteClass {
final public static Map<String, FieldDescriptor> fields;
static {
Map<String, FieldDescriptor> myFields = new HashMap<String, FieldDescriptor>();
myFields.put("PERSON_CODE", new FieldDescriptor("PERSON_CODE", 10, true);
myFields.put("FUN_FUN_FUN", new FieldDescriptor("FUN_FUN_FUN", 6, false);
myFields.put("JEDI_POWER_RATING", new FieldDescriptor("JEDI_POWER_RATING", 9000, true);
fields = Collections.unmodifiableMap(myFields);
}
private String personCode;
private String funFunFun;
private String jediPowerRating;
public void setPersonCode(String personCode) {
this.personCode = transformField(fields.get("PERSON_CODE"), personCode);
}
...
}
整个reason for the maddness is the transformField call on the setters
。这是我创建地图的核心所在。
但是我想从我的课程中抽象出来,因为我希望以这种方式构建更多的课程,并且能够一般地或通过界面引用map
。
我强烈认为Map应该封装在一个单独的类中!但是,如何实现ConcreteClass的实例化?
任何人都可以确定合适的设计模式吗?
答案 0 :(得分:0)
我不确定我是否理解你的问题。但如果我的理解是正确的,我可能会利用反射和对象的实例,而不是引入一个名为FieldDescriptor的自定义类。然后我再也不知道你的完整用例,所以我可能错了。
所以这是我的解决方案:
每个类都必须有一个名为defaultInstance的默认静态字段。 defaultInstance与Class本身的类型相同。如果我使用像spring这样的框架,我将尝试利用框架回调方法来填充defaultInstance(对我来说简洁,如果管理对象的生命周期)。我们的想法是让一个外部组件负责为每个类提供其defaultInstance。 (动态注射??)。
一旦类需要访问存储在默认实例中的值,它就可以使用Reflection API或Apache BeanUtils之类的包装来获取单个字段名称和值。
我看到你有一个名为isKey的布尔字段。如果在运行时需要此信息,则可以使用自定义注释将某些字段指示为Key,并使用isAnnotation Present来实现分支逻辑。
因此,在调用结束时,您只需要在每个类中都有一个名为defaultInstance的属性。有一个组件,负责填充此对象。 (为了使其可配置,您可以将信息存储在属性文件或数据库中,如sqllite)。如果可以,请使用动态注入或AOP(以便其非侵入性)并直接使用Apache BeanUtils或Reflection API来获取信息。 (即使这个逻辑应该被抽象为一个单独的组件)。
答案 1 :(得分:0)
看起来您希望所有字段定义的额外复杂性的唯一原因是您可以将字段与数据库表中的关联列属性相关联。您不必自己编写 - 使用像Spring或Hibernate这样的持久性框架来为您完成这项工作。它们在内部使用反射,有助于保持数据传输对象(DTO)清洁和易于维护。