Java 根据作为 Object 字段给出的 EnumType 实现业务逻辑

Java implementing business logic based on EnumType given as field of Object

我知道我的问题标题与我的问题无关,但没有更好的标题。但请随意建议标题。 (所以这对其他人也有帮助)

这是我遇到的情况:

enumclass如下

public enum CalendarBasis {
    FISCAL_YEAR,
    CALENDAR
}

这个enum在项目中多个objects使用。

我想知道要遵循的最佳 practice/design 模式,这将有助于获得基于 enum 值的功能。今天 CalendarBasis 中只有两个值,但明天可能有多个值。

这是我目前正在做的事情: 考虑一下我有 Object SpecificElement,它有 CalendarBasis 枚举参数。

public class SpecificElement {
  private SpecificValue specificValue; //some object
  // few more Objects defined
  private CalendarBasis calendarBasis;

  //getters & setters
}

以下函数根据 calendarBasis 的类型对 SpecificElement 进行一些操作。

public Foo doCalculations(SpecificElement specificElement)
{

  if(specificElement.getCalendarBasis().equals(CalendarBasis.FISCAL_YEAR)){
    //do something based on fiscal & return.
  }
  if(specificElement.getCalendarBasis().equals(CalendarBasis.CALENDAR)){
    //do something based on CALENDAR & return.
  }

}

我想知道我是否可以拥有类似多个 class 基于枚举值的实现并在实现 class 中执行与 enum 相关的操作。 doCalculations 大约有 8-10 种不同的功能,它们具有基于 enum 类型的业务逻辑。

我遵循的代码结构似乎不是一个好习惯。

所以,如果有人能告诉我如何构建这种场景,那将会很有帮助。

举个Siddarth Sreeni的具体例子

您创建了一个界面:

public interface Calculations {
    Foo doCalculations(SpecificElement element);
}

然后让枚举实现接口:

public enum CalendarBasis implements Calculations {
    FISCAL_YEAR {
        @Override
        public Foo doCalculations(SpecificElement element) {
            return new OtherFoo();
        }
    },
    CALENDAR {
        @Override
        public Foo doCalculations(SpecificElement element) {
            return new Foo();
        }
    }
}

您的主要 doCalculations 方法将如下所示:

public Foo doCalculations(SpecificElement specificElement) {
    return specificElement.getCalendarBasis().doCalculations(specificElement);
}

我会强烈考虑为此使用 Strategy 模式。通过将不同的计算分离到它们自己的 类,这应该有助于保持代码的清洁和可维护性。您可以使用工厂来获得正确的计算类型。

public enum CalendarBasis {
    FISCAL_YEAR,
    CALENDAR
}

public interface Calculation {

    double performCalculation();

}

public class FiscalCalculation implements Calculation {

    @Override
    public double performCalculation() {
        //Perform calculation.
    }
}

public class CalendarCalculation implements Calculation {

    @Override
    public double performCalculation() {
        //Perform calculation.
    }
}

public class CalculationFactory {

    public static Calculation getCalculation(CalendarBasis calendarBasis) {
        switch (calendarBasis) {
            case CALENDAR: return new CalendarCalculation();
            case FISCAL_YEAR: return new FiscalCalculation();
            default:
                //Should not happen.
                throw new IllegalArgumentException("Invalid basis: " + calendarBasis);
        }
    }
}

//Usage
double result = CalculationFactory.getCalculation(specificObject.getCalendarBasis()).performCalculation();

我想你可以使用 EnumMap。如果您的策略是无状态的(在您的示例中似乎就是这种情况),那么您只需使用所有策略初始化一个地图并使用 StrategyType 检索您想要的策略。

    enum CalendarBasisStrategyType { FISCAL_YEAR, CALENDAR }

    static EnumMap<CalendarBasisStrategyType, CalendarBasisStrategy> lookupStrategy = new EnumMap();
    {
        lookupStrategy.put(FISCAL_YEAR, new FiscalYearStrategyObject());
        lookupStrategy.put(CALENDAR, new CalenderBasisStrategyObject());
    }


    CalendarBasisStrategy toStrategy(CalendarBasisStrategyType type) {
        return lookupStrategy.get(type);
    }
If it is not stateless then you can use Factory for Creating Objects.
    enum CalendarBasisStrategyType { FISCAL_YEAR, CALENDAR }

    static EnumMap<CalendarBasisStrategyType, CalendarBasisFactory> lookupFactory = new EnumMap();
    {
        ...
    }


    CalendarBasisStrategy toStrategy(CalendarBasisStrategyType type) {
        return lookupFactory.get(type).newInstance();
    }