Java 使用开关盒简化以下代码?

Java 使用开关盒简化以下代码?,java,Java,我正在检查日期的有效性。我只能用其他的和开关箱。我不确定以下内容是否可以简化 if (monthNum<1||monthNum>12){ validDate=false; System.out.println("Invalid Date Entered"); } else if ((monthNum==1||monthNum==3||monthNum==5||monthNum==7||monthNum==8||monthNum==10||monthNum==12)&

我正在检查日期的有效性。我只能用其他的和开关箱。我不确定以下内容是否可以简化

if (monthNum<1||monthNum>12){
    validDate=false;
    System.out.println("Invalid Date Entered");
}

else if ((monthNum==1||monthNum==3||monthNum==5||monthNum==7||monthNum==8||monthNum==10||monthNum==12)&&(dayNum<1||dayNum>31)) {
    validDate=false;
    System.out.println("Invalid date entered");
}

else if ((monthNum==4||monthNum==6||monthNum==9||monthNum==11)&&(dayNum<1||dayNum>30)){
    validDate=false;
    System.out.println("Invalid date entered");
}

else if (monthNum==2 &&(dayNum<1||dayNum>28)) {
    validDate=false;
    System.out.println("Invalid date entered");
}

else {
    validDate=true;
}
if(12个月){
validDate=假;
System.out.println(“输入的日期无效”);
}
else如果((monthNum==1 | | monthNum==3 | | monthNum==5 | | | monthNum==7 | | monthNum==8 | | monthNum==10 | | monthNum==12)和(dayNum31)){
validDate=假;
System.out.println(“输入的日期无效”);
}
else如果((monthNum==4 | | monthNum==6 | | monthNum==9 | | monthNum==11)和&(dayNum30)){
validDate=假;
System.out.println(“输入的日期无效”);
}
否则如果(月=2&(日数28)){
validDate=假;
System.out.println(“输入的日期无效”);
}
否则{
validDate=真;
}

我建议查看java.util.Calendar并使用setLenient(false),而不是编写自己的日期检查逻辑


检查JavaDocs at)

而不是编写自己的日期检查逻辑,我建议查看java.util.Calendar并使用setLenent(false)

查看JavaDocs(位于)

(为简洁起见,简化了条件)

可更改为:

boolean validDate = !(a||b||c||d);
这有帮助吗?

(简化的简洁条件)

boolean validateDate(int monthNum, int dayNum) {
    if (dayNum < 1)
        return false;
    switch (monthNum) {
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
        return dayNum <= 31;
    case 4:
    case 6:
    case 9:
    case 11:
        return dayNum <= 30;
    case 2:
        return dayNum <= 28;
    }
    return false;
}
可更改为:

boolean validDate = !(a||b||c||d);
这有帮助吗?

boolean validateDate(int monthNum,int dayNum){
boolean validateDate(int monthNum, int dayNum) {
    if (dayNum < 1)
        return false;
    switch (monthNum) {
    case 1:
    case 3:
    case 5:
    case 7:
    case 8:
    case 10:
    case 12:
        return dayNum <= 31;
    case 4:
    case 6:
    case 9:
    case 11:
        return dayNum <= 30;
    case 2:
        return dayNum <= 28;
    }
    return false;
}
如果(dayNum<1) 返回false; 开关(蒙特纳姆){ 案例1: 案例3: 案例5: 案例7: 案例8: 案例10: 案例12: 返回dayNum
boolean validateDate(int-monthNum,int-dayNum){
如果(dayNum<1)
返回false;
开关(蒙特纳姆){
案例1:
案例3:
案例5:
案例7:
案例8:
案例10:
案例12:

return dayNum以下是您可以考虑的一些事情:

在设计良好的软件中,这种验证可能会以其自己的方法出现:

bool validateDate(int monthNum, int dayNum) {
     // your code goes here
}
我们还可以将月和日验证划分为各自的方法,例如:

bool validateMonth(int monthNum) {
    return (1 <= monthNum) && (monthNum <= 12)
}

bool validateDay(int monthNum, int dayNum) {
    // ...
}
剩下的部分我肯定会使用开关:

switch(monthNum) {
    case 1:
    case 3:
    // ...
    case 12:
        return dayNum <= 31;
    // similarly for the other months
    // ...
    case default:
        // should probably do something about invalid monthNum
}

这并不是对代码的剧烈更改(它有几乎相同的流程),但它更具组织性,而且
开关处理倍数
==
检查更方便。

以下是一些您可以考虑的事情:

在设计良好的软件中,这种验证可能会以其自己的方法出现:

bool validateDate(int monthNum, int dayNum) {
     // your code goes here
}
我们还可以将月和日验证划分为各自的方法,例如:

bool validateMonth(int monthNum) {
    return (1 <= monthNum) && (monthNum <= 12)
}

bool validateDay(int monthNum, int dayNum) {
    // ...
}
剩下的部分我肯定会使用开关:

switch(monthNum) {
    case 1:
    case 3:
    // ...
    case 12:
        return dayNum <= 31;
    // similarly for the other months
    // ...
    case default:
        // should probably do something about invalid monthNum
}

这并不是对代码的重大更改(它具有几乎相同的流程),但它更具组织性,而且一个
开关处理倍数
=
检查更方便。

1-28总是有效的。从那开始。只有当数字>28时才切换。

1-28总是有效的。从那开始。只有当数字>28时才切换。

首先,在一天的开始做一次检查Num<1。我不知道有哪一个月有一天0.:-)

如果您保持当前的If/else系统,我至少会将日期检查与月份检查分开。此外,我个人的偏好是,将逻辑设置为积极的-这通常更容易遵循。一两条评论也不错

e、 g

//三十天有九月、四月、六月和十一月
else if((monthNum==4 | | monthNum==6 | | monthNum==9 | | monthNum==11)){
validDate=dayNum首先,在一开始检查dayNum<1。我不知道有哪个月的日期为0:-)

如果您保持当前的If/else系统,我至少会将日期检查与月份检查分开。此外,我个人的偏好是,将逻辑设置为积极的-这通常更容易遵循。一两条评论也不错

e、 g

//三十天有九月、四月、六月和十一月
else if((monthNum==4 | | monthNum==6 | | monthNum==9 | | monthNum==11)){

validDate=dayNum将闰年处理添加到mergeconflict的答案中:

private static boolean validateDate(int yearNum, int monthNum, int dayNum) {

if (monthNum < 1 || monthNum > 12) return false;
if (dayNum < 1 ) return false;

switch(monthNum) {
  case 1: case 3: case 5: case 7: case 8: case 10: case 12:
    return dayNum <= 31;
  case 4: case 6: case 9: case 11:
    return dayNum <= 30;
  default: // 2
    boolean leapYear = (yearNum % 4 == 0 && yearNum % 100 != 0) || yearNum % 400 == 0;
    if (leapYear) {
      return dayNum <= 29;
    } else {
      return dayNum <= 28;
    }
}
private static boolean validateDate(int dearneum、int monthNum、int dayNum){
如果(monthNum<1 | | monthNum>12)返回false;
如果(dayNum<1)返回false;
开关(蒙特纳姆){
案例1:案例3:案例5:案例7:案例8:案例10:案例12:

return dayNum将闰年处理添加到mergeconflict的答案中:

private static boolean validateDate(int yearNum, int monthNum, int dayNum) {

if (monthNum < 1 || monthNum > 12) return false;
if (dayNum < 1 ) return false;

switch(monthNum) {
  case 1: case 3: case 5: case 7: case 8: case 10: case 12:
    return dayNum <= 31;
  case 4: case 6: case 9: case 11:
    return dayNum <= 30;
  default: // 2
    boolean leapYear = (yearNum % 4 == 0 && yearNum % 100 != 0) || yearNum % 400 == 0;
    if (leapYear) {
      return dayNum <= 29;
    } else {
      return dayNum <= 28;
    }
}
private static boolean validateDate(int dearneum、int monthNum、int dayNum){
如果(monthNum<1 | | monthNum>12)返回false;
如果(dayNum<1)返回false;
开关(蒙特纳姆){
案例1:案例3:案例5:案例7:案例8:案例10:案例12:

return dayNum以下较短,它使用了这样一个事实,即您可以在始终保持的检查上添加更详细的检查(即所有月份的天数都少于32天),并将sysout消息移动到所有测试完成的位置

boolean validDate = (monthNum >= 1 && monthNum <= 12 && dayNum >= 1 && dayNum <= 31);

if (monthNum == 4 || monthNum == 6 || monthNum == 9 || monthNum == 11) {

    validDate &&= (dayNum <= 30);
}

else if (monthNum == 2) {

    validDate &&= (dayNum <= 28);
}

if (!validDate) {
    System.out.println("Invalid Date Entered");
}

boolean validDate=(monthNum>=1&&monthNum=1&&dayNum以下内容较短,它使用了这样一个事实,即您可以在始终保持的检查上添加更详细的检查(即所有月份都少于32天),并将sysout消息移动到完成所有测试的位置

boolean validDate = (monthNum >= 1 && monthNum <= 12 && dayNum >= 1 && dayNum <= 31);

if (monthNum == 4 || monthNum == 6 || monthNum == 9 || monthNum == 11) {

    validDate &&= (dayNum <= 30);
}

else if (monthNum == 2) {

    validDate &&= (dayNum <= 28);
}

if (!validDate) {
    System.out.println("Invalid Date Entered");
}

boolean validDate=(monthNum>=1&&monthNum=1&&dayNum为什么只能使用
else
开关
案例?这是作业吗?如果是,请添加“作业”标记。@user2979616:2月29日发生了什么事!?这些系统输出是必需的吗?否则,如果
-
否则
条件
的话,你只需要一个
。@user988052而不是
dayNum>28
他可以尝试
dayNum>(new gregorianaldendar.isLeapYear(new gregorianalendar().YEAR))29:28;
为什么只能使用
else
切换
案例?这是作业吗?如果是,请添加“作业”标记。@user2979616:2月29日发生了什么事!?这些系统输出是必需的吗?否则,如果
-
否则
条件
的话,你只需要一个
。@user988052而不是
dayNum>28
由于限制,他可以尝试
dayNum>(new gregorianaldendar.isLeapYear(new gregorianalendar().YEAR))29:28;