当前位置: 首页 > 面试题库 >

让二传手返回“ this”是否是错误的做法?

赵选
2023-03-14
问题内容

使Java中的setter返回“ this”是好是坏的主意?

public Employee setName(String name){
   this.name = name;
   return this;
}

此模式很有用,因为这样您就可以像这样链接设置器:

list.add(new Employee().setName("Jack Sparrow").setId(1).setFoo("bacon!"));

代替这个:

Employee e = new Employee();
e.setName("Jack Sparrow");
...and so on...
list.add(e);

…但是有点违反标准惯例。我想这可能是值得的,因为它可以使设置者做其他有用的事情。我已经看到此模式在某些地方使用过(例如JMock,JPA),但这似乎并不常见,并且仅用于定义非常明确的API,该模式随处可见。

更新:

我所描述的显然是有效的,但是我真正要寻找的是一些关于是否可以普遍接受以及是否存在陷阱或相关最佳实践的想法。我了解Builder模式,但它比我描述的要复杂得多-
正如Josh Bloch所描述的那样,有一个关联的静态Builder类用于对象创建。


问题答案:

我不认为这有什么特别的问题,这只是风格问题。在以下情况下很有用:

  • 您需要一次设置多个字段(包括在施工中)
  • 您知道在编写代码时需要设置哪些字段,以及
  • 您想为哪些字段设置许多不同的组合。

此方法的替代方法可能是:

  1. 一个大型构造函数(缺点:您可能传递大量的null或默认值,并且很难知道哪个值对应什么)
  2. 几个重载的构造函数(缺点:一旦有多个,就会变得笨拙)
  3. 工厂/静态方法(缺点:与重载的构造函数相同-一旦存在过多,就会变得笨拙)

如果您一次只设置几个属性,我会说不值得返回“ this”。如果您以后决定返回其他内容,例如状态/成功指示符/消息,它肯定会掉下来。



 类似资料:
  • 问题内容: 我正在尝试为博客平台创建一个构造函数,并且内部进行了许多异步操作。这些范围包括从目录中获取帖子,对其进行解析,通过模板引擎发送它们,等等。 所以我的问题是,让我的构造函数返回一个promise而不是调用它们的函数的对象是不明智的。 例如: 现在,用户可能 还不 提供补充的Promise链接: 这可能会带来问题,因为用户可能会感到困惑,为什么 在构造后仍然无法使用。 在构造函数中使用Pr

  • 我有一个。net.ashx处理程序,它接收jQuery AJAX post,格式化向第三方服务发送的web服务请求,并使用结果。成功后,它将使用相关信息实例化匿名对象,并格式化JSON响应字符串。 如果出现web服务错误,我将执行以下操作: 这使得jQuery AJAX错误回调可以轻松地访问状态代码和描述;然而,我实现这一点的方式是相当武断的。 在对以下问题进行了一些阅读之后,我找不到一个结论性的

  • 问题内容: 在系统调用的手册页中,write(2) - 它说如下: 返回值 成功后,将返回写入的字节数(零表示未写入任何字节)。出错时,返回-1,并进行适当设置。如果count为零,并且文件描述符引用的是常规文件,则可能返回0,或者可能检测到错误。对于特殊文件,结果不可移植。 我将其解释为意味着返回0只是意味着无论出于何种原因,均未写入任何内容。 但是,在处理TCP套接字的文件描述符时,UNP中的

  • 404错误不会作为库中的直接返回,而是作为错误抛出在捕获中。我的问题是现在我可以以某种方式在捕获中查询,错误有哪个数字? 或者如何使用axios库查询它是否是404错误?

  • 问题内容: 我正在尝试为博客平台创建一个构造函数,并且其中包含许多异步操作。这些范围包括从目录中获取帖子,对其进行解析,通过模板引擎发送它们,等等。 所以我的问题是,让我的构造函数返回一个promise而不是调用它们的函数的对象是不明智的。 例如: 现在,用户可能 还不 提供补充的Promise链接: 这可能会带来问题,因为用户可能会感到困惑,为什么 在构造后仍然无法使用。 在构造函数中使用Pro

  • 我在路径“/test”中有一个无用的endpoint: 我这样测试: 但我得到一个断言错误: 预期状态代码 这发生在更多的代码中:400,500...除了200。 我用的是Spring靴。如果在运行测试时在endpoint方法中放置断点,则执行将停止,因此测试中的请求将正确完成。如果我将状态代码(在资源和测试中也是)更改为200,则测试通过。 到底发生了什么?