Java竞赛项目持久化方案选型:枚举vs抽象类
竞赛参与者排名API的项目评级实现方案选择
我正在开发一个竞赛参与者排名API,竞赛包含俯卧撑、跑步等不同项目,各项目计分规则不同——比如俯卧撑按次数统计、跑步按秒数统计。我打算通过定义可重写的getRating(int mark)方法来实现项目评级,mark代表比如5次俯卧撑或10秒跑步这类成绩,方法返回运动员在该项目的评级。
方案一:使用枚举实现
我考虑用枚举封装每个项目的属性和评级逻辑,示例代码如下:
public enum Trial { PUSH_UPS("Push-ups", "Test your upper body strength by doing push-ups.") { @Override public String getRating(int result) { if (result >= 40) { return "Excellent"; } else if (result >= 30) { return "Good"; } else if (result >= 20) { return "Fair"; } else { return "Poor"; } } }, PULL_UPS("Pull-ups", "Test your upper body strength by doing pull-ups.") { @Override public String getRating(int result) { if (result >= 20) { return "Excellent"; } else if (result >= 15) { return "Good"; } else if (result >= 10) { return "Fair"; } else { return "Poor"; } } }, RUNNING("Running", "Test your cardiovascular endurance by running.") { @Override public String getRating(int result) { if (result <= 420) { // 7 minutes (420 seconds) for 1 mile return "Excellent"; } else if (result <= 540) { // 9 minutes (540 seconds) for 1 mile return "Good"; } else if (result <= 660) { // 11 minutes (660 seconds) for 1 mile return "Fair"; } else { return "Poor"; } } }; private final String name; private final String description; Trial(String name, String description) { this.name = name; this.description = description; } public String getName() { return name; } public String getDescription() { return description; } public abstract String getRating(int result); }
疑问:
- 持久化可以用
@Enumerated注解,但项目名称、描述等属性未存储在数据库中,后续获取这些信息会不会出现问题? - 若竞赛数量增多,项目数量也大幅增加,这种方案是否仍适用?
方案二:抽象类+子类实现
定义抽象类Trial封装通用属性和抽象评级方法,每个项目继承该抽象类实现具体评级逻辑,持久化考虑单表存储,示例代码如下:
抽象类Trial
public abstract class Trial { private final String name; private final String description; protected Trial(String name, String description) { this.name = name; this.description = description; } public String getName() { return name; } public String getDescription() { return description; } public abstract String getRating(int result); }
项目子类示例
public class PushUpsTrial extends Trial { public PushUpsTrial() { super("Push-ups", "Test your upper body strength by doing push-ups."); } @Override public String getRating(int result) { if (result >= 40) { return "Excellent"; } else if (result >= 30) { return "Good"; } else if (result >= 20) { return "Fair"; } else { return "Poor"; } } } public class PullUpsTrial extends Trial { public PullUpsTrial() { super("Pull-ups", "Test your upper body strength by doing pull-ups."); } @Override public String getRating(int result) { if (result >= 20) { return "Excellent"; } else if (result >= 15) { return "Good"; } else if (result >= 10) { return "Fair"; } else { return "Poor"; } } } public class RunningTrial extends Trial { public RunningTrial() { super("Running", "Test your cardiovascular endurance by running."); } @Override public String getRating(int result) { if (result <= 420) { // 7 minutes (420 seconds) for 1 mile return "Excellent"; } else if (result <= 540) { // 9 minutes (540 seconds) for 1 mile return "Good"; } else if (result <= 660) { // 11 minutes (660 seconds) for 1 mile return "Fair"; } else { return "Poor"; } } }
疑问:
- 这种方案是否需要为每个项目单独编写Service、DAO和Controller?有没有简化该结构的方法?
请教问题
- 哪种方案更优?
- 是否有其他更好的解决方案?
- 两种方案最终效果是否一致?
内容的提问来源于stack exchange,提问作者Ignacio Ovidio Muñoz Nicolás
相关产品推荐
相关产品推荐

