繁体   English   中英

聪明的二传手? 好主意还是坏主意?

[英]Smarter setter? Good or Bad Idea?

在GWT解决方案中。 (所以这是Java代码,然后将其编译为javascript)。 当然有一些课程。

在字符串字段上让setter检查Null是否是一个好主意?

像这样的东西

public void setSomeField(String someField){
  if (null != someField)
    this.someField = someField;
  else
    this.someField = String.Empty;
}

这是一个好主意还是坏主意? 一方面,它将使编码变得更容易,因为我不必检查null;另一方面,这可能使我可能忘记了我必须对其他字符串执行此操作。

有什么想法吗? 谢谢

我说的是,如果您的应用程序需要这种逻辑,则使用设置器即可。 围绕私有变量进行获取/设置包装的主要原因是能够在访问周围放置逻辑。

回答默认还是不默认的问题:在我的应用程序中,出于显示原因,使得一组属性回落到string.empty。 尽管人们可能会争辩说视图应该涵盖这些可能性,并检查是否为空并且什么也不显示,但是在我的页面上充斥着大量精力来检查每个属性。

这就是为什么我开始实现SafeXX属性的原因。 所以说我有一个'myObj.Name'可能有一个空值,还有一个属性'myObj.SafeName'在getter中捕获了null并返回了string.empty。 小小的命名约定表明它不是常规的获取方法。

这是要考虑的事情。 您希望该单元测试通过还是失败?:

yourClass.setSomeField(null);
assertNull(yourClass.getSomeField());

如果要将null值更改为空字符串并在getSomeField中返回该值,则客户端现在必须在测试时检查两个条件... String和null String。 没什么大不了的,但是如果您在类中有二十个String属性,会发生什么……您最好尝试在所有设置方法中保持一致,如果不是,则原因可能更多不只是文档这么说而已。

在getter和setter周围有某些约定。 一定的期望。 如果我在一个对象上调用一个setter,那么我通常希望getter返回我设置的内容。 我不希望它返回我传入的内容的某种表示形式,这对于类在内部使用它更方便。 我不在乎课程的内部,也不想。

如果确实出于有效原因将null真正更改为"" (例如,它可能表示“我不在乎”,而默认值可能是"" ),则继续(但要记录下来)。

否则,就像您刚刚捕获到NullPointerException并尝试以这种方式修复它一样,请不要这样做。 如果调用者使用明显无效的值,则应尽快引发异常,以便调用者在可能完全不相关的组件中引发严重的,无法解释的错误之前注意到问题并加以解决。

通常,检查空值不是一个好主意,因为调用者(调用设置程序的人)可能确实希望将值设置为空。

假设您使用以下命令查询“ someField”:

select * from ... where someField is null

如果将其设置为空字符串,则上面的查询将失败。

如果您不希望将字段设置为null,则不要将其设置为null。

如果您无法控制执行设置的代码,那么这是个好主意,但是如果这样做,则最好从源头上解决问题,而不要像这样进行解决。

这很难回答。 乍一看,它似乎使用法更好,因为您不必一直检查null。 但是您会失去null的质量,这意味着什么也没有分配。 如果您执行String.Empty,那么如果有人给您String.Empty作为参数,您就已经模棱两可。 也许没关系。

我个人(如果有的话)不会在二传手中做到这一点。 在您的类内部,null应该具有自己的值。 如果您是为了方便起见

return (this.someField != null) ? this.someField: String.Empty;

会做。 您可以在内部保留null以进行处理,但在外部可以使用更方便的方法。

一般来说,就我个人而言,我不会这样做。 起初看起来不错,后来又使很多事情变得困难。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM