java - 类中的逻辑和数据

标签 java design-patterns

我有以下类(class):

class AbstractFruitData  {
    int size;
    int weight;
}

class FruitData extends AbstractFruitData {
    String name;
}

class AppleData extends FruitData {
    String garden;

    String getGarden() {
        return garden;
    }
}

class AbstractFruit<T extends AbstractFruitData> {
    T data;

    void setData(T data) {
        this.data = data;
    }

    T getData() {
        return data;
    }
}

class Fruit<T extends FruitData> extends AbstractFruit<AbstractFruitData> {
    String colour;
}

class Apple extends Fruit<AppleData> {
}

然后如果我写下面的代码:

Apple apple = new Apple();
apple.setData(new AppleData());
apple.getData().getGarden(); <-- error

这是错误,因为 dataAbstractFruitData 类型。我可以转换,但是否可以在 Java 中编写代码,其中 setDatagetData 方法将在编译时仅对 AppleData 进行操作?

第二个问题:是否有任何设计模式可以用更好的架构代替这种类结构?

最佳答案

您应该能够说服编译器让您访问 getGarden通过插入 T进入AbstractFruit<T>Fruit 的声明中,像这样:

class Fruit<T extends FruitData> extends AbstractFruit<T> {
    String colour; //                                  ^
}                  // Here is the change --------------+

一旦您做出此更改,您的类将编译并运行良好 (demo on ideone)。

就问题的第二部分而言,管理并行类层次结构没有 Elixir ;您让调用者将类与其数据配对的方法非常合理,因为用户可以完全访问类及其数据。

您可以通过使用接口(interface)代替您的一些基类来获得一些灵 active ,但最终如果两个类需要相互了解,则没有通用的方法将其抽象为更高层的类层次结构。

关于java - 类中的逻辑和数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23835202/

相关文章:

java - 用于 Java 应用程序的 Zipkin

java - 我的代码在 index::12 处缺少 IN 或 OUT 参数是怎么回事

python - 在 Python 中折叠或展开列表子序列的优雅方式?

Java 的 JavaScript 构造函数格式相似性

design-patterns - 生成器模式 : Do all builder return the same type ?

java - 幕后的外观和构建器模式

java - jooq - 将代码添加到生成的 Record 类

java - 无法执行目标 org.sonarsource.scanner.maven 对于 Artifact {null :null:null:jar}: The groupId cannot be empty

java - 如何在Spring中从序列生成实体字段的部分值?

java - Google Guice 不就是另一个工厂吗?