我正在研究一个组件,该组件应该:

  • 从某个外部计算组件接收数据(项目集合)。我希望每个请求输入约100-1K的项目。
  • 验证数据,如果缺少
  • 则计算一些属性
  • 保留数据

  • 大约有十种类型的项目。我使用继承来建模项目。我有一个具有共同属性和计算的基类,以及实现类型特定问题的子类。与以下示例类似:
    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();
        }
    }
    

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

    最佳答案

    您尝试使用的模式相当合理。通常,我可能建议使用接口而不是BaseItem类,因为它可能不包含那么多通用功能。

    通常,大多数人似乎建议为类定义接口。如果绝对要在AbstractClass中共享通用代码,我建议使用实现该接口的类,因为这种模式将来会使其具有更大的可扩展性和灵活性。

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

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

    然后,您将开始实现Abstract类。仅在确实需要在所有项目之间共享代码库时才执行此操作。
    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();
        }
    }
    

    10-04 10:06