【问题标题】:Is there a Java equivalent for PowerScript "CHOOSE CASE"?PowerScript“选择案例”是否有Java等效项?
【发布时间】:2013-05-21 17:35:17
【问题描述】:

我发现PowerScript's CHOOSE CASE 语句非常有用,因为它使代码比很多ifs 和else ifs 更清晰。

这是一个如何工作的例子,来自上面的链接:

CHOOSE CASE weight
   CASE IS < 16
        Postage=Weight*0.30
        Method="USPS"
   CASE 16 to 48
        Postage=4.50
        Method="UPS"
   CASE ELSE
        Postage=25.00
        Method="FedEx"
END CHOOSE

CASE 5 to 11CASE 5, 6, 7, 8, 9, 10, 11 相同

注意CHOOSE CASE不等同于java的switch

【问题讨论】:

标签: java


【解决方案1】:

在 Java 中,您可以使用多个 case 语句,但没有一种很好的方法可以将表达式指定为 case 限定符,只能使用文字:

switch(weight) {
  case 1:
  case 2:
  case 3:
    postage = weight * 0.30;
    method = "USPS";
    break;
  case 4:
  case 5:
  case 6:
    postage = 4.5;
    method = "UPS";
    break;
  default:
    postage = 25.0;
    method = "FedEx";
    break;
}

要获得不错的范围,请坚持使用 if/else:

if(weight > 0 && weight <= 3) {
  postage = weight * 0.30;
  method = "USPS";
}
else if(weight > 3 && weight <= 6) {
  postage = 4.5;
  method = "UPS";
}
else {
  postage = 25.0;
  method = "FedEx";
}

【讨论】:

  • +1 很好的答案,但我一直在为这个逻辑寻找更易读的代码。
【解决方案2】:

如果您的目标是清理决策点,您可以将决定应用哪种情况的代码与使用该决策的代码分开封装,如下所示:

enum WeightClass { LOW, MEDIUM, HIGH };

public WeightClass determineWeightClass(int weight)
{
    return (weight < 16) 
        ? WeightClass.LOW 
        : (weight <= 48 
            ? WeightClass.MEDIUM 
            : WeightClass.HIGH);
}

在决策点:

switch(determineWeightClass(weight))
{
    case LOW:
        ...
        break;
    case MEDIUM:
        ...
        break;
    case HIGH:
        ...
        break;
}

【讨论】:

  • 虽然没有CHOOSE CASE那么干净,但是代码的可读性还是不错的
【解决方案3】:

不完全一样。如果你想在Java中实现这样的片段,你必须使用if-else[-if]语句。

基本上应该是这样的:

if (weight < 16) {
   //something
} else if (weight >= 16 && weight <= 48) {
   //something else 
} else {
   //some other thing
}

希望它对你有用。 :)

【讨论】:

    【解决方案4】:

    如果只有 3 种情况,一系列 if/else 就可以了。如果您有很多条件,您可以使用 Navigable 地图并将其与枚举相结合,以获得漂亮而流畅的设计:

    public class Test1 {
    
        public static void main(String[] args) {
            printDelivery(0);
            printDelivery(5);
            printDelivery(16);
            printDelivery(48);
            printDelivery(50);
        }
    
        private static void printDelivery(int weight) {
            Delivery d = Delivery.getDelivery(weight);
            System.out.println("Weight: " + weight + " => $" + d.getPostage(weight) + " with " + d.getMethod());
        }
    
        static enum Delivery {
            LOW_WEIGHT(15) {
                 public double getPostage(int weight) { return 0.3 * weight; }
                 public String getMethod() { return "USPS"; }
            }, MEDIUM_WEIGHT(47) {
                public double getPostage(int weight) { return 4.5; }
                public String getMethod() { return "UPS"; }
            }, HIGH_WEIGHT(Integer.MAX_VALUE){
                public double getPostage(int weight) { return 25.0; }
                public String getMethod() { return "FedEx"; }
            };
            private static final NavigableMap<Integer, Delivery> deliveries = new TreeMap<> ();
            static {
                for (Delivery e : values()) {
                    deliveries.put(e.maxWeight, e);
                }
            }
            private final int maxWeight;
            Delivery(int maxWeight) {
                this.maxWeight = maxWeight;
            }
            public static Delivery getDelivery(int weight) {
                return deliveries.ceilingEntry(weight).getValue();
            }
    
            abstract double getPostage(int weight);
            abstract String getMethod();
        }
    }
    

    【讨论】:

      【解决方案5】:

      没有。您将不得不使用一系列 if-elseif-else 语句。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多