Java 使用 List of items

问题描述

我需要简化我的方法我需要在所有工作日运行这个方法

 if (!getAbsenceSo().equals("-")) {
        switch (getAbsenceSo()){
            case "uabgelehnt": setAbsenceSo("-"); break;
            case "urlaubbeantragt": setAbsenceSo("-"); break;
            case "urlaubgenehmigt": setAbsenceSo("Urlaub"); setArbeitMinutenSo((int)(wochenarbeitstunden*60/5)); break;
            case "sonderurlaub":  setAbsenceSo("Sonderurlaub"); setArbeitMinutenSo((int)(wochenarbeitstunden*60/5)); break;
            case "ueabsetzer": setAbsenceSo("Ü-Absetzer"); break;
            case "krank": setAbsenceSo("Krank"); setArbeitMinutenSo((int)(wochenarbeitstunden*60/5)); break;
            case "kindkrank": setAbsenceSo("Kindkrank"); setArbeitMinutenSo((int)(wochenarbeitstunden*60/5)); break;
            case "fbschule": setAbsenceSo("FB/Schule"); setArbeitMinutenSo((int)(wochenarbeitstunden*60/5)); break;
            case "kurzarbeit": setAbsenceSo("Kurzarbeit"); setArbeitMinutenSo((int)(wochenarbeitstunden*60/5)); break;
            case "unentschuldigt": setAbsenceSo("Unentschuldigt");  break;
        }
    }

所以下一个代码片段看起来像这样:

 if (!getAbsenceMo().equals("-")) {
    switch (getAbsenceMo()){
        case "uabgelehnt": setAbsenceMo("-"); break; and so on...

有什么方法可以防止重复代码吗?

我对 Java 的了解并不多 - 你能给我一个提示吗? 我可以在从字符串组合在一起的对象中调用一个方法。 例如我怎样才能调用“setAbsense”+item("-"); ???或者更好地应该如何做到这一点???非常感谢!!!

解决方法

不要尝试动态构造方法调用。相反,重新考虑您的设计。您的代码需要为相同类型的多个实例(相同的数据、相同的方法)执行。这已经表明:使用一个类。每个实例(Mo、Tu、...)都具有相同的信息,但您可以在该实例本身上对其进行操作。

帮助您前进的快速示例:

public class App {
    static class Absence {
        private DayOfWeek dayOfWeek;
        private String reason;
        private int arbeitMinuten;

        public Absence(DayOfWeek dayOfWeek,String reason) {
            this.dayOfWeek = dayOfWeek;
            this.reason = reason;
        }

        public DayOfWeek getDayOfWeek() {
            return dayOfWeek;
        }

        public void setDayOfWeek(DayOfWeek dayOfWeek) {
            this.dayOfWeek = dayOfWeek;
        }

        public String getReason() {
            return reason;
        }

        public void setReason(String reason) {
            this.reason = reason;
        }

        public int getArbeitMinuten() {
            return arbeitMinuten;
        }

        public void setArbeitMinuten(int arbeitMinuten) {
            this.arbeitMinuten = arbeitMinuten;
        }
    }

    public static void main(String[] args) throws IOException {
        int wochenarbeitstunden = 40;

        List<Absence> absenceList;
        // Build from your Datasource
        absenceList = List.of(new Absence(DayOfWeek.MONDAY,"uabgelehnt"),new Absence(DayOfWeek.TUESDAY,"Krank"),new Absence(DayOfWeek.WEDNESDAY,"Kurzarbeit"));

        for (Absence absence : absenceList) {
            switch (absence.getReason()) {
                case "uabgelehnt" -> absence.setReason("-");
                case "urlaubbeantragt" -> absence.setReason("-");
                case "urlaubgenehmigt" -> {
                    absence.setReason("Urlaub");
                    absence.setArbeitMinuten(wochenarbeitstunden * 60 / 5);
                }
                case "sonderurlaub" -> {
                    absence.setReason("Sonderurlaub");
                    absence.setArbeitMinuten(wochenarbeitstunden * 60 / 5);
                }
                case "ueabsetzer" -> absence.setReason("Ü-Absetzer");
                case "krank" -> {
                    absence.setReason("Krank");
                    absence.setArbeitMinuten(wochenarbeitstunden * 60 / 5);
                }
                case "kindkrank" -> {
                    absence.setReason("Kindkrank");
                    absence.setArbeitMinuten(wochenarbeitstunden * 60 / 5);
                }
                case "fbschule" -> {
                    absence.setReason("FB/Schule");
                    absence.setArbeitMinuten(wochenarbeitstunden * 60 / 5);
                }
                case "kurzarbeit" -> {
                    absence.setReason("Kurzarbeit");
                    absence.setArbeitMinuten(wochenarbeitstunden * 60 / 5);
                }
                case "unentschuldigt" -> absence.setReason("Unentschuldigt");
                default -> {}
            }
        }
    }
}