请考虑以下代码:
public interface MyClass {
public final String getMyObject1();
public final String getMyObject2();
}
public class MyClass1 implements MyClass {
private String myObject1;
private String myObject2;
public MyClass1(String myObject1, String myObject2) {
this.myObject1 = myObject1;
this.myObject2 = myObject2;
}
public String getMyObject1() {
return myObject1;
}
public String getMyObject2() {
return myObject2;
}
}
public interface MyClass2 extends MyClass {
public static MyClass2 newInstance(String myObject1, String myObject2) {
return new MyClass2() {
public String getMyObject1() {
return myObject1;
}
public String getMyObject2() {
return myObject2;
}
};
}
}
我使用它们就像
public static void func(MyClass m) {
m.getMyObject1();
m.getMyObject2();
}
func(new MyClass1(o1, o2));
func(MyClass2.newInstance(o1, o2));
我想知道它们是如何不同的,如果我只需要读取值(即使用MyClass作为" struct"来传递值),使用匿名类可以是一种更简单的方法吗?
否则,什么是退款?
答案 0 :(得分:5)
编程的一个核心规则:尝试不让读者感到惊讶。
您在接口中使用 static 类作为“工厂”方法的方法非常令人惊讶(并且相信我:我已经看到很多的Java代码) 。
如果有的话,处理这类事情的“常见”方式更多:创建一个名称略有相似的静态类,就像java.lang.Object和带有一些有用的静态的java.lang.Objects一样辅助方法。
除此之外,Java中已经有一个类可以帮助任意数量的“命名”值;那被称为Map
!
最后:对于“DTO”(data transfer objects)有一些很好的论据,但是esp。对于“初学者”,你应该选择“真正的”OO设计;基于SOLID原则。从这个意义上说:设计真正的类,它们可以准确地模拟您的问题域;并提供有用的抽象。具有任意数量成员的结构...不属于任何一种类别。
答案 1 :(得分:0)
这里的问题不仅仅是代码而是设计。我很想知道你在这里设计的真实世界用例。
第二种方法肯定存在局限性,因为一旦创建了类就无法更新对象的值,因为您只需要一种方法来获取传递的对象的值。
回到设计:
接口应该是您的类在实现该接口时可以执行的操作。在您的情况下,您尝试使用接口中的两个方法返回两个实例变量的值,这是一种操作,但它忽略了封装的基本原则。
如果你的类定义/拥有那些实例变量,它应该有getter和setter。您不应该要求接口来执行此操作。因此理想情况下,您的界面不应该是必需的。任何其他使用MyClass1对象的类都应该直接使用MyClass1的getter和setter。