我和我的一位同事试图解决以下问题:这是反模式的一个例子吗?
让我们班的一个示例的 我的一个同事正面临着从A 提取一个特定的属性从一个特定抓取一个属性的问题类(在这种情况下,A)很容易。但假设 假设您有多个类(A1,A2 ...),并且您想从这些类的集合中获取一个具有越来越多的代码重用性的特定属性。
例如
public class A {
private String name;
.
.
.
}
List<String> listOfNames = createNameList(listOfAInstances);
createNameList()方法将像以下:
List<String> tempList = new ArrayList<>();
for(A a : listOfAInstances) {
tempList.add(a.getName());
}
return tempList;
现在,如果有多个类我不得不为每个类和不同的属性做到这一点。
我建议两种方法:基于
- 思考方法。
- 创建一个名为“PropertyExtractable”的接口,并在其中放入一个名为“extractProperty”的方法。
如下图所示:
interface PropertyExtractable {
Object extractProperty();
}
public class A implements PropertyExtractable {
private String name;
.
.
.
public Object extractProperty() {
return this.name;
}
}
为此,我可以写,然后可以随处即
public Object getPropertiesOfPropertyExtractable(PropertyExtractable prExtractable) {
return prExtractable.extractProperty();
}
这是背景中使用的一些实用的方法,矿井中的一个其他同事曾对第二种方法有不同的看法,他告诉我这似乎是反模式。他试图向我解释,但我没有完全理解,所以我在这里问。
我想比较这个例子与Java中的Comparator接口。像java允许我们在任何自定义对象类上使用比较器,并允许我们定义用于比较的逻辑,那么为什么我无法定义提取的逻辑
更多更多的接口可以这种方式使用,那么为什么我们不应该用它
我想知道的是这种方法是反模式吗?为什么?
嗯,我的第一个想法是,它不是类型安全的。然后,如果您可以拥有不同类别的列表,那么您已经需要拥有这些类别的通用界面。为什么不在其中包含一个'String getName()'? – Fildor
如果您的示例代码和“例如”文本与他们的类名匹配,它会有很大的帮助。 –
不要忘记,您可以在重写的方法中使用更具体的返回类型:''中的'public String extractProperty()'''。然后,如果你有一个'A'的引用,你可以编写'String name = myA.extractProperty();',而不需要强制转换。 –