在 Java 中使用匿名 class 到 return 值
Using an anonymous class to return values in Java
考虑以下代码:
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" 来传递值),使用匿名 class 是否可以更简单方法?
否则,有什么缺点?
编程的一个核心规则:尽量不要让你的读者感到惊讶。
您在这里使用 static class 作为 "factory" 方法的方法非常令人惊讶(相信我:我已经看到 很多 的Java 代码)。
如果有的话,更多 "common" 处理此类事情的方法:创建一个名称略微相似的静态 class,就像 java.lang.Object 和 java.lang.Objects 带有一些有用的静态辅助方法。
除此之外,Java 中已经有一个 class 可以帮助处理 任意 个 "named" 值;那就是所谓的Map
!
最后:"DTO"s 有一些很好的论据(data transfer objects) but esp. for "beginners", you should rather look into "real" OO designs; based on the SOLID 原则。从这个意义上说:设计 real classes that准确模拟您的问题域;并提供 有用的 抽象。具有任意数量成员的结构......不属于任何一类。
这里的问题不一定是代码,而是设计。我很想知道您在这里尝试设计的真实用例。
第二种方法当然有局限性,比如一旦创建 class 就无法更新对象的值,因为您只有一种方法可以取回传递的对象的值。
回到设计:
接口应该是您的 class 实现该接口后可以执行的操作。在您的情况下,您正在尝试使用接口中的两种方法 return 两个实例变量的值,这是一种操作,但它忽略了封装的基本原则。
如果您的 class defines/owns 那些实例变量,它应该具有相应的 getter 和 setter。你不应该需要一个接口来做到这一点。所以理想情况下,您的界面应该不是必需的。任何其他使用 MyClass1 对象的 class 应该直接使用 MyClass1 的 getter 和 setter。
考虑以下代码:
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" 来传递值),使用匿名 class 是否可以更简单方法?
否则,有什么缺点?
编程的一个核心规则:尽量不要让你的读者感到惊讶。
您在这里使用 static class 作为 "factory" 方法的方法非常令人惊讶(相信我:我已经看到 很多 的Java 代码)。
如果有的话,更多 "common" 处理此类事情的方法:创建一个名称略微相似的静态 class,就像 java.lang.Object 和 java.lang.Objects 带有一些有用的静态辅助方法。
除此之外,Java 中已经有一个 class 可以帮助处理 任意 个 "named" 值;那就是所谓的Map
!
最后:"DTO"s 有一些很好的论据(data transfer objects) but esp. for "beginners", you should rather look into "real" OO designs; based on the SOLID 原则。从这个意义上说:设计 real classes that准确模拟您的问题域;并提供 有用的 抽象。具有任意数量成员的结构......不属于任何一类。
这里的问题不一定是代码,而是设计。我很想知道您在这里尝试设计的真实用例。
第二种方法当然有局限性,比如一旦创建 class 就无法更新对象的值,因为您只有一种方法可以取回传递的对象的值。
回到设计:
接口应该是您的 class 实现该接口后可以执行的操作。在您的情况下,您正在尝试使用接口中的两种方法 return 两个实例变量的值,这是一种操作,但它忽略了封装的基本原则。
如果您的 class defines/owns 那些实例变量,它应该具有相应的 getter 和 setter。你不应该需要一个接口来做到这一点。所以理想情况下,您的界面应该不是必需的。任何其他使用 MyClass1 对象的 class 应该直接使用 MyClass1 的 getter 和 setter。