Java 根据作为 Object 字段给出的 EnumType 实现业务逻辑
Java implementing business logic based on EnumType given as field of Object
我知道我的问题标题与我的问题无关,但没有更好的标题。但请随意建议标题。 (所以这对其他人也有帮助)
这是我遇到的情况:
我enum
class如下
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();
}
我知道我的问题标题与我的问题无关,但没有更好的标题。但请随意建议标题。 (所以这对其他人也有帮助)
这是我遇到的情况:
我enum
class如下
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();
}