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

wz3gfoph  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(377)

我正在为圣诞节制作临期日历,需要使用switch语句。我最大的困惑是,每一天都会有一个特别为那一天设计的新班级。我正在研究google和stack overflow能提供什么。我想知道有没有别的办法来压缩这个?

  1. public void onClick(View v) {
  2. //Calculate the days between (date - 12/7/20)
  3. LocalDate dateBefore = java.time.LocalDate.now();
  4. LocalDate dateAfter = LocalDate.of(2020, Month.DECEMBER, 25);
  5. int daysAway = (int) ChronoUnit.DAYS.between(dateBefore, dateAfter);
  6. switch(daysAway){
  7. case 24:
  8. openDay1();
  9. break;
  10. case 23:
  11. openDay2();
  12. break;
  13. case 22:
  14. openDay3;
  15. break;
  16. case 21:
  17. openDay4;
  18. break;
  19. case 20:
  20. openDay5;
  21. break;
  22. case 19:
  23. openDay6;
  24. break;
  25. case 18:
  26. openDay7;
  27. break;
  28. case 17:
  29. openDay8;
  30. break;
  31. case 16:
  32. openDay9;
  33. break;
  34. case 15:
  35. openDay10;
  36. break;
  37. case 14:
  38. openDay11;
  39. break;
  40. case 13:
  41. openDay12;
  42. break;
  43. case 12:
  44. openDay13;
  45. break;
  46. case 11:
  47. openDay14;
  48. break;
  49. case 10:
  50. openDay15;
  51. break;
  52. case 9:
  53. openDay16;
  54. break;
  55. case 8:
  56. openDay17;
  57. break;
  58. case 7:
  59. openDay18;
  60. break;
  61. case 6:
  62. openDay19;
  63. break;
  64. case 5:
  65. openDay20;
  66. break;
  67. case 4:
  68. openDay21;
  69. break;
  70. case 3:
  71. openDay22;
  72. break;
  73. case 2:
  74. openDay23;
  75. break;
  76. case 1:
  77. openDay24;
  78. break;
  79. case 0:
  80. openChristmas;
  81. break;
  82. default:
  83. notTime.start();
  84. break;
  85. }
  86. }

我知道这是一个巨大的混乱,这就是我试图修复!我很感激你能给我的任何反馈!

mf98qq94

mf98qq941#

  1. if (daysAway > 0)
  2. openDay(25-daysAway); // you haven't shown what you would do here,
  3. // but presumably you don't need to write 24 separate functions
  4. else
  5. notTime.start();
ncgqoxb0

ncgqoxb02#

使用java 14开关表达式语法:

  1. switch (daysAway) {
  2. case 24 -> openDay1();
  3. case 23 -> openDay2();
  4. case 22 -> openDay3();
  5. case 21 -> openDay4();
  6. // ...
  7. case 4 -> openDay21();
  8. case 3 -> openDay22();
  9. case 2 -> openDay23();
  10. case 1 -> openDay24();
  11. case 0 -> openChristmas();
  12. default -> notTime.start();
  13. }

由于代码非常简单,只需将其折叠到一行:

  1. switch (daysAway) {
  2. case 24: openDay1(); break;
  3. case 23: openDay2(); break;
  4. case 22: openDay3(); break;
  5. case 21: openDay4(); break;
  6. // ...
  7. case 4: openDay21(); break;
  8. case 3: openDay22(); break;
  9. case 2: openDay23(); break;
  10. case 1: openDay24(); break;
  11. case 0: openChristmas(); break;
  12. default: notTime.start();
  13. }

使用java 8方法引用数组(注意顺序颠倒):

  1. Runnable[] OPEN_METHODS = {
  2. this::openChristmas,
  3. this::openDay24,
  4. this::openDay23,
  5. this::openDay22,
  6. this::openDay21,
  7. // ...
  8. this::openDay4,
  9. this::openDay3,
  10. this::openDay2,
  11. this::openDay1
  12. };
  1. if (daysAway >= 0 && daysAway <= 24) {
  2. OPEN_METHODS[daysAway].run();
  3. } else {
  4. notTime.start();
  5. }

既然你说过“每个(daysaway)案例都会打开一个为那一天设计的新类”,那么就使用一个接口(例如。 Runnable )以及类文字数组:

  1. Class<?>[] OPEN_CLASSES = {
  2. OpenChristmas.class,
  3. OpenDay24.class,
  4. OpenDay23.class,
  5. OpenDay22.class,
  6. OpenDay21.class,
  7. // ...
  8. OpenDay4.class,
  9. OpenDay3.class,
  10. OpenDay2.class,
  11. OpenDay1.class
  12. };
  1. if (daysAway < 0 || daysAway > 24) {
  2. notTime.start();
  3. } else {
  4. Runnable clazz;
  5. try {
  6. clazz = (Runnable) OPEN_CLASSES[daysAway].getConstructor().newInstance();
  7. } catch (ReflectiveOperationException e) {
  8. throw new AssertionError("Oops: " + e, e);
  9. }
  10. clazz.run();
  11. }

您还可以动态地构建类名(没有数组或 switch 声明):

  1. if (daysAway < 0 || daysAway > 24) {
  2. notTime.start();
  3. } else {
  4. String className = (daysAway == 0 ? "OpenChristmas" : "OpenDay" + (25 - daysAway));
  5. Runnable clazz;
  6. try {
  7. clazz = (Runnable) Class.forName(className).getConstructor().newInstance();
  8. } catch (ReflectiveOperationException e) {
  9. throw new AssertionError("Oops: " + e, e);
  10. }
  11. clazz.run();
  12. }
展开查看全部

相关问题