有没有办法让这个switch语句更小更专业呢?

Is there a way to make this switch statement smaller and more professional?

我正在为圣诞节制作降临节日历,需要使用 switch 语句。我最大的难题是,每个 (daysAway) 案例都会打开一个新的 class 专门为那天设计的。我正在处理 Google 和 Stack overflow 可以提供的内容。我想知道是否有任何其他方法可以压缩它?

public void onClick(View v) {

            //Calculate the days between (date - 12/7/20)
            LocalDate dateBefore = java.time.LocalDate.now();
            LocalDate dateAfter = LocalDate.of(2020, Month.DECEMBER, 25);
            int daysAway = (int) ChronoUnit.DAYS.between(dateBefore, dateAfter);

            switch(daysAway){
                case 24:
                    openDay1();
                    break;
                case 23:
                    openDay2();
                    break;
                case 22:
                    openDay3;
                    break;
                case 21:
                    openDay4;
                    break;
                case 20:
                    openDay5;
                    break;
                case 19:
                    openDay6;
                    break;
                case 18:
                    openDay7;
                    break;
                case 17:
                    openDay8;
                    break;
                case 16:
                    openDay9;
                    break;
                case 15:
                    openDay10;
                    break;
                case 14:
                    openDay11;
                    break;
                case 13:
                    openDay12;
                    break;
                case 12:
                    openDay13;
                    break;
                case 11:
                    openDay14;
                    break;
                case 10:
                    openDay15;
                    break;
                case 9:
                    openDay16;
                    break;
                case 8:
                    openDay17;
                    break;
                case 7:
                    openDay18;
                    break;
                case 6:
                    openDay19;
                    break;
                case 5:
                    openDay20;
                    break;
                case 4:
                    openDay21;
                    break;
                case 3:
                    openDay22;
                    break;
                case 2:
                    openDay23;
                    break;
                case 1:
                    openDay24;
                    break;
                case 0:
                    openChristmas;
                    break;
                default:
                    notTime.start();
                    break;
            }
        }

我知道这是一团糟,这就是我要解决的问题! 感谢您提供的任何反馈!

if (daysAway > 0)
  openDay(25-daysAway); // you haven't shown what you would do here,
         //  but presumably you don't need to write 24 separate functions
else
  notTime.start();
  1. 使用Java14 switch表达式语法:

    switch (daysAway) {
        case 24 -> openDay1();
        case 23 -> openDay2();
        case 22 -> openDay3();
        case 21 -> openDay4();
        // ...
        case 4  -> openDay21();
        case 3  -> openDay22();
        case 2  -> openDay23();
        case 1  -> openDay24();
        case 0  -> openChristmas();
        default -> notTime.start();
    }
    
  2. 由于代码很简单,就折叠成一行:

    switch (daysAway) {
        case 24: openDay1();  break;
        case 23: openDay2();  break;
        case 22: openDay3();  break;
        case 21: openDay4();  break;
        // ...
        case 4:  openDay21(); break;
        case 3:  openDay22(); break;
        case 2:  openDay23(); break;
        case 1:  openDay24(); break;
        case 0:  openChristmas(); break;
        default: notTime.start();
    }
    
  3. 使用数组Java 8个方法引用(注意倒序):

    Runnable[] OPEN_METHODS = {
        this::openChristmas,
        this::openDay24,
        this::openDay23,
        this::openDay22,
        this::openDay21,
        // ...
        this::openDay4,
        this::openDay3,
        this::openDay2,
        this::openDay1
    };
    
    if (daysAway >= 0 && daysAway <= 24) {
        OPEN_METHODS[daysAway].run();
    } else {
        notTime.start();
    }
    
  4. 既然你说 “每个(daysAway)案例都会打开一个 新的 class 为那天设计的,使用接口(例如 Runnable)和 class 文字数组:

    Class<?>[] OPEN_CLASSES = {
        OpenChristmas.class,
        OpenDay24.class,
        OpenDay23.class,
        OpenDay22.class,
        OpenDay21.class,
        // ...
        OpenDay4.class,
        OpenDay3.class,
        OpenDay2.class,
        OpenDay1.class
    };
    
    if (daysAway < 0 || daysAway > 24) {
        notTime.start();
    } else {
        Runnable clazz;
        try {
            clazz = (Runnable) OPEN_CLASSES[daysAway].getConstructor().newInstance();
        } catch (ReflectiveOperationException e) {
            throw new AssertionError("Oops: " + e, e);
        }
        clazz.run();
    }
    
  5. 您还可以动态构建 class 名称(无数组或 switch 语句):

    if (daysAway < 0 || daysAway > 24) {
        notTime.start();
    } else {
        String className = (daysAway == 0 ? "OpenChristmas" : "OpenDay" + (25 - daysAway));
        Runnable clazz;
        try {
            clazz = (Runnable) Class.forName(className).getConstructor().newInstance();
        } catch (ReflectiveOperationException e) {
            throw new AssertionError("Oops: " + e, e);
        }
        clazz.run();
    }