首页 > 解决方案 > 使用 Java 从链式方法中的 Setter 和 Getter 方法中检索特定值

问题描述

我正在尝试使用 java 方法链接从 setter 方法中获取特定值。就像我们做 obj.setId(1).setValue(5) 一样。我们如何使用 obj.setId(1).getValue() 获得 value = 5;

这是主要课程

public class MenuDish {

    private String name;
    private double price;
    private String description;
    private int category;
    private  int spiciness;
    private boolean healthy;

    public MenuDish(){ //constrcutor

    }

    public MenuDish setPrice(double price){

        if(price < 0.0){
            this.price = 0.0;
        }
        else{
            this.price = price;
        }
        return this;
    }
    public double getPrice() {
        return this.price;
    }

    public MenuDish setDay(int day){

    return new MenuDish();//just do nothing 
}

}

子类

AdjustableMenuDish 类

public class AdjustableMenuDish extends  MenuDish {
    private int day;
    private double price;

        public AdjustableMenuDish(){ //constructor
        setName(null);
        setPrice(0);
        setDescription(null);
        setCategory(0);
        setHealthy(false);
        setSpiciness(0);
    }

    @Override
    public MenuDish setDay(int day){

        this.day = day;
        return this;
    }

}

在主要方法中,我正在尝试做这样的事情。

AdjustableMenuDish dish = new AdjustableMenuDish();
dish.setDay(0).setPrice(3.4);
dish.setDay(3).setPrice(7.4);
System.out.println(dish.setDay(0).getPrice());//--->output 7.4 but how to
get 3.4 instead of 7.4

基本上我试图从一天中得到具体的价格。

编辑

我想通过下面给出的 Junit 测试用例

@Test public void test_daily_prices() {
      AdjustableMenuDish dish = new AdjustableMenuDish();
      for (int i = MenuDish.MONDAY; i <= MenuDish.SUNDAY;  i++) {
          double p = 1.0+i;

          double a = dish.setDay(i).setPrice(p).getPrice();

          assertEquals(p, a, 0.0001);
     }

      for (int i = MenuDish.MONDAY; i <= MenuDish.SUNDAY;  i++) {
          double p = 1.0+i;
          double a = dish.setDay(i).getPrice();
          assertEquals(p, a, 0.0001);
      }
  }

预期失败 1.0 但为 7.0

标签: javaobjectsettergettermethod-chaining

解决方案


您需要将日期和价格配对在一起,而不是将它们作为MenuDish. 您可以尝试以下方法:

class AdjustableMenuDish {
    private double[] prices = new double[7]; // Assumes day as [0..6]
    ...
    public AdjustableMenuDish setPrice(int day, double price) {
        prices[day] = price;
        return this;
    }
    public double getPrice(int day) {
        return prices[day];
    }
}

如果每道菜的价格根据日期不同而不同,则此代码可能在MenuDish. 如果只是一些菜,那么它可能属于AdjustableMenuDish.

鉴于价格实际上是每天的价格,我认为您应该将两者一起提交,即。在一种方法中(如上所述)。如果您真的想像现在一样坚持使用您的MenuDishAPI,那么您可以尝试以下方法。这将跟踪当前日期。

class MenuDish {
    private double[] prices = new double[7]; // Assumes day as [0..6]
    private int day;
    ...
    public MenuDish setDay(int day) {
        this.day = day;
        return this;
    }
    public MenuDish setPrice(double price) {
        prices[day] = price;
        return this;
    }
    public double getPrice() {
        return prices[day];
    }
}

推荐阅读