You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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?有没有简化该结构的方法?

请教问题

  1. 哪种方案更优?
  2. 是否有其他更好的解决方案?
  3. 两种方案最终效果是否一致?

内容的提问来源于stack exchange,提问作者Ignacio Ovidio Muñoz Nicolás

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 15:48:12