定义setter返回值

发布于 2024-12-19 02:14:16 字数 389 浏览 2 评论 0原文

我刚刚在我的一个项目中遇到了问题。也许我对封装的概念有误。 封装通过定义 getters 和 setters 方法来保护类中的成员变量,现在,我读到 setters 必须为 void,但在这种情况下,我如何知道函数是否真正设置了参数传递的值。例如,

void setArea(int a) {
  if(a>0)
    Area = a;
}

我如何确定参数“a”是正确的值,像这样定义函数不是更好吗

bool setArea(int a) {
  if(a>0) {
    Area = a;
    return true;
  }
  return false;
}

?这样我就可以知道变化是否真的发生了。

I just had a problem in one of my projects. Maybe I got the wrong concept about encapsulation.
Encapsulation protects member variables from classes, by defining getters and setters methods, now, i was reading that setters must be void, but in that case, how can I know if the function really set the value passed by argument. For example

void setArea(int a) {
  if(a>0)
    Area = a;
}

How can I be sure that argument "a" was a correct value, wouldnt be better defining the function like this

bool setArea(int a) {
  if(a>0) {
    Area = a;
    return true;
  }
  return false;
}

Is that ok? that way i can know if a change really happened.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

心凉怎暖 2024-12-26 02:14:16

我认为您正在寻找的是一个 guard 子句,如果设置了无效值,它会引发异常:

void setArea(int a) {
  if (a <= 0) throw new InvalidArgumentException(...);
  Area = a;
}

但是,如果您希望客户端代码在设置它们之前测试无效值,您可以这样做:

bool isAreaValid(int a) {
  return a > 0;
}

void setArea(int a) {
  if (!isAreaValid(a)) throw new InvalidArgumentException(...);
  Area = a;
}

客户端可以这样编码:

if (obj.isAreaValid(myArea)) {
  obj.setArea(myArea);
}

但不要就此停止。如果面积的概念很重要,请将其融入到自己的 value 对象 使您的设计更加清晰。

I think what you're looking for is a guard clause that throws an exception if invalid values are set:

void setArea(int a) {
  if (a <= 0) throw new InvalidArgumentException(...);
  Area = a;
}

But if you want client code to test for invalid values before setting them, you could have this:

bool isAreaValid(int a) {
  return a > 0;
}

void setArea(int a) {
  if (!isAreaValid(a)) throw new InvalidArgumentException(...);
  Area = a;
}

Clients could be coded like this:

if (obj.isAreaValid(myArea)) {
  obj.setArea(myArea);
}

But don't stop there. If the concept of area is important, spring it into existence into its own value object to make your design clearer.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文