Java 是否使用具有非 void 返回类型的 setter 方法打破了自己的规则?

K M*_*Man 1 java setter nio

我了解到标准约定是 setter 不返回任何内容。但是,NIO.2 API 有一些方法,如 setOwner、setLastModifiedTime 和 setAttribute,它们返回 Path 实例。这些方法不是真正的 setter,还是不是所有的 setter 都必须有 void 返回类型?

Kay*_*man 6

陈旧的JavaBean标准(这是为了与工具,这样的JavaBean可以自动处理的帮助下)可能说过一些关于无效制定者,但流利的构建旨在使事情变得更容易。

允许方法链接可以生成更好的代码,并且由于没有充分理由要求voidsetter 返回类型,因此他们选择使用程序(不,他们还没有看到注释):

path.setOwner(foo).setLastModifiedTime(bar).setAttribute(baz);
Run Code Online (Sandbox Code Playgroud)

JDK 在StringBuilder和 等类中确实有流畅接口的示例ProcessBuilder,但它们避免使用setXXX命名法(可能是为了避免混淆),即使它是有意义的。StringBuilder.append()显然不会被命名setMoreText(),但ProcessBuilder.directory(File)不如setWorkingDirectory(File)恕我直言那么明显。

  • 实际上,`setOwner`、`setLastModifiedTime`、`setAttribute` 方法都是 java.nio.file.Files` 类中的静态方法。你不能像以前那样链接它们,但链接的想法仍然存在,因为,比方说,“Files.setLastModifiedTime(Path path, FileTime time)”返回第一个参数。链接可能如下所示:`Files.setLastModifiedTime(myPath, myFileTime).resolve(anotherPath)` (2认同)
  • JavaBean 规范肯定没有过时。[EL](https://docs.oracle.com/javaee/7/api/javax/el/package-summary.html)(由 JSP 和 JSF 使用)使用它们。[JavaFX](https://openjfx.io/javadoc/13/javafx.base/javafx/beans/property/package-summary.html) 使用它们。JAXB 使用它们。[XMLEncoder](https://docs.oracle.com/en/java/javase/13/docs/api/java.desktop/java/beans/XMLEncoder.html) 和 XMLDecoder 使用它们。 (2认同)