使用匿名类在Java中返回值

时间:2017-02-26 19:47:50

标签: java anonymous-class

请考虑以下代码:

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"来传递值),使用匿名类可以是一种更简单的方法吗?

否则,什么是退款?

2 个答案:

答案 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。