gpt4 book ai didi

java - 继承与否

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:31:41 25 4
gpt4 key购买 nike

我正在开发一个组件,它应该:

  1. 从一些外部计算组件接收数据(项目集合)。我预计每个请求的输入项大约为 100-1K。

  2. 验证数据,如果缺失则计算一些属性

  3. 持久化数据

大约有十种类型的元素。我使用继承来建模项目。我有一个具有公共(public)属性和计算的基本项目类,以及实现特定类型问题的子类。类似于以下示例:

public abstract class BaseItem {
String name;
boolean valid = true;

public void postCalucate() {
//common calculation
valid = valid && (name != null);
}
}

public class ItemA extends BaseItem {
BigDecimal value;

@Override
public void postCalucate() {
//some A specific calculations
super.postCalucate();
}
}

public class ItemA1 extends ItemA {
BigDecimal extraValue;

@Override
public void postCalucate() {
//some A1 subtype specific calculations
valid = isA1ItemValid();
super.postCalucate();
}
}

public class ItemB extends BaseItem {
Integer size;

@Override
public void postCalucate() {
//some B specific calculations
super.postCalucate();
}
}

有没有更好的方法/模式来完成我的任务?有什么建议吗?

最佳答案

您尝试使用的模式非常合理。一般来说,我可能会建议使用接口(interface)而不是 BaseItem 类,因为它可能不包含那么多通用功能。

一般来说,大多数人似乎都建议为要实现的类定义接口(interface)。如果您绝对想在 AbstractClass 中共享公共(public)代码,我会推荐该类实现该接口(interface),因为这种模式在未来会带来更大的可扩展性和灵 active 。

因此,您首先要定义适合您的Item。对我来说,在您的用例中,一个 Item 似乎是三件事:第一,它必须定义将在所有 Items 上调用的 postCalculate() 方法。其次,它必须提供一个 isValid() 方法。第三,它还应该提供一个 getName() 方法。

public interface Item {
void postCalucate();
boolean isValid();
String getName();
}

然后您将开始实现您的抽象类。仅当确实有必要在所有项目之间共享代码库时才这样做。

public abstract class BaseItem implements Item {
String name;
boolean valid = true;

public void postCalucate() {
//common calculation
valid = valid && (name != null);
}

public boolean isValid() {
return valid;
}

public String getName() {
return name;
}
}

如果 BaseItem.postCalculate() 是需要对所有项目执行的操作,那么这是执行此操作的好方法。如果您不完全确定,最好在 HelperTool 类中的某处定义一个方法来对项目执行此通用计算,并且由 postCalculate() 方法调用:

public class ItemTools {
public static boolean meetsRequirements(Item item) {
return item.isValid && item.getName() != null;
}
}

许多人会争辩说,这会让您更轻松,因为您对 BaseItem 的要求可能会随着时间而改变。

无论您走哪条路线,现在您只需定义您的实际项目:

public   class ItemA extends BaseItem {
BigDecimal value;

@Override
public void postCalucate() {
//some A specific calculations
super.postCalucate();
}
}

关于java - 继承与否,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13146319/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com