在 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。