【发布时间】:2011-12-10 14:20:30
【问题描述】:
我希望能够为一堆相关但不同的类读取和写入(获取和设置)某些字段,而无需知道它们究竟是什么类型的具体类。我所知道的是,它们有一些我希望能够通用访问和修改的参数类型。鉴于我不知道该类是什么具体类型,我也不知道每个类的具体参数类型是什么。
- 我认为以下方法可行,但它是否足够好/可能存在什么问题?
- 或者对于这个问题有更好的方法/甚至是既定的设计模式?
允许通用配置的超类
public abstract class ParametrizerBase<P1, P2> {
public P1 Param1;
public P2 Param2;
}
需要特定参数的具体类
public class SomeConcreteClass extends ParametrizerBase<Boolean, String> {
public SomeConcreteClass(Boolean enabled, String task){
Param1 = enabled;
Param2 = task;
}
// ... does something with the parameter data
}
另一个具有不同数据类型的具体类
public class AnotherConcreteClass extends ParametrizerBase<Integer, Date> {
public AnotherConcreteClass(Integer numberOfItems, Date when){
Param1 = numberOfItems;
Param2 = when;
}
// ... does something with the data it holds
}
示例用法
ArrayList<ParametrizerBase> list;
public void initSomewhere() {
SomeConcreteClass some = new SomeConcreteClass(true,"Smth");
AnotherConcreteClass another = new AnotherConcreteClass(5, new Date());
list = new ArrayList<ParametrizerBase>();
list.add(some);
list.add(another);
}
public void provideDataElsewhere() {
for (ParametrizerBase concrete : list) {
String param1Type = concrete.Param1.getClass().getName();
if (param1Type.contains("Boolean")) {
Boolean value = concrete.Param1;
// Now could let user modify this Boolean with a checkbox
// and if they do modify, then write it to concrete.Param1 = ...
// All without knowing what Param1 is (generic configuration)
} else if (param1Type.contains("Integer")) {
Integer value = concrete.Param1;
// ...
} // ...
// Same for Param2 ...
}
}
【问题讨论】:
-
尝试 instanceof,而不是获取类名字符串然后进行比较。 (顺便提一下,使用这个技巧时要注意子类)
标签: java android generics design-patterns data-binding