【问题标题】:Java getter returning original value instead of value updated by setterJava getter 返回原始值而不是由 setter 更新的值
【发布时间】:2015-12-02 21:43:17
【问题描述】:

我正在做一个为照片制作滤镜的项目,我们使用 getter 和 setter 方法设置新的 RGB 值。

public class Color {

private double red;
private double green;
private double blue;

public Color() {
this.setRed(1.0);
this.setGreen(1.0);
this.setBlue(1.0);
}

public Color(double red, double green, double blue) {
this.setRed(red);
this.setGreen(green);
this.setBlue(blue);
}

... (code for other functions after those tests pass)

public double getRed(){
  return red;
}

public void setRed(double color1){
  if (color1 <= 1.0){
      if (color1 >= 0.0){
          red = color1;
      }
  }
  else if (color1>1.0){
      red=1.0;
  }
  else if (color1<0.0){
      red=0.0;
  }
}

}

每个 getter 和 setter 都是 getRed/setRed 的副本。我已经通过我无权访问的程序检查了定义,但这是我收到的输出:

测试失败:

场景:3.1 - 调用 setRed(-1.0) 后,getRed() 的返回值应该是 0.0

颜色(1.0,1.0,1.0).setRed(-1.0) - 好的

Color(1.0,1.0,1.0).getRed() - 预期 0.0 - 返回 1.0

所以 setter 按我的需要运行,但 getter 正在返回原始值。这不是一个孤立的情况,我的每个 getter 在每个 setter 成功运行时都返回各自颜色的原始值 (1.0)。

【问题讨论】:

  • 每次运行 getter 时是否都在创建新颜色?
  • 每次测试运行都没有新颜色。我们使用相同的 Color 实例进行 set/get 的东部测试运行
  • 单传:this.red = color1 &lt; 0.0 ? 0.0 : color1 &gt; 1.0 ? 1.0 : color1;
  • @HovercraftFullOfEels 这似乎可以实现相同的最终目标,但教师似乎对这种实现有疑虑(至少测试代码是这样)。不过,将其保存为将来程序的注释。
  • 只是提出一些一般性建议: 1) 由于这是一个值类,您应该强烈考虑使其实例不可变; 2)考虑用Builder Pattern 构造颜色实例; 3) 在不可变类上测试不变量的最佳位置是在构造函数中(这将允许您从 setter 方法中进行测试)。

标签: java getter-setter


【解决方案1】:

您的最后一个条件else if (color1&lt;0.0) { red=0.0; } 永远不会是true,因为color1 小于0 的所有情况都将在第一个if 语句if (color1 &lt;= 1.0) 中被捕获。因此,永远不会设置值 0.0

【讨论】:

  • 这似乎是问题所在。将嵌套的 if 从普通的 if 更改为 if/else 似乎已经成功了。非常感谢。
  • @jobosno 很高兴我能帮上忙。如果这解决了您的问题,您可以通过单击我的回复左侧的标记来接受我的回复。
  • 您至少需要 15 分钟才能接受答案。在所述时间限制到期后,我很乐意将其标记为此类。再次感谢!
  • @jobosno 啊,好的。不知道那件事。谢谢。
猜你喜欢
  • 2021-02-05
  • 2018-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-17
  • 2022-07-22
  • 1970-01-01
相关资源
最近更新 更多