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

Java中的命名参数习语

赖淇
2023-03-14
问题内容

如何在Java中实现命名参数习语?(特别是对于构造函数)

我在寻找一种类似于Objective-C的语法,而不是在JavaBeans中使用的一种语法。

一个小的代码示例就可以了。

谢谢。


问题答案:

我似乎最喜欢在构造函数中模拟关键字参数的Java惯用语是Builder模式,有效Java 2nd
Edition中
对此进行了描述。

基本思想是拥有一个Builder类,该类具有用于不同构造函数参数的setter(但通常没有getter)。还有一种build()方法。Builder类通常是用于构建的类的(静态)嵌套类。外部类的构造函数通常是私有的。

最终结果如下所示:

public class Foo {
  public static class Builder {
    public Foo build() {
      return new Foo(this);
    }

    public Builder setSize(int size) {
      this.size = size;
      return this;
    }

    public Builder setColor(Color color) {
      this.color = color;
      return this;
    }

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

    // you can set defaults for these here
    private int size;
    private Color color;
    private String name;
  }

  public static Builder builder() {
      return new Builder();
  }

  private Foo(Builder builder) {
    size = builder.size;
    color = builder.color;
    name = builder.name;
  }

  private final int size;
  private final Color color;
  private final String name;

  // The rest of Foo goes here...
}

要创建Foo的实例,您可以编写以下内容:

Foo foo = Foo.builder()
    .setColor(red)
    .setName("Fred")
    .setSize(42)
    .build();

主要警告如下:

  1. 设置模式非常繁琐(如您所见)。除了计划在许多地方实例化的类以外,可能不值得。
  2. 没有编译时检查是否所有参数都只指定了一次。您可以添加运行时检查,也可以仅将其用于可选参数,并使必需参数成为Foo或Builder的构造函数的常规参数。(人们通常不必担心多次设置相同参数的情况。)

您可能还想查看此博客文章(不是我的)。



 类似资料:
  • 问题内容: 是否有一个名为JDBC中,而不是那些位置参数,比如在下面的查询? 问题答案: JDBC不支持命名参数。除非你必须使用普通的JDBC(这会造成麻烦,让我告诉你),否则我建议使用Springs Excellent JDBCTemplate,它可以在没有整个IoC容器的情况下使用。 NamedParameterJDBCTemplate支持命名参数,你可以像这样使用它们:

  • 本文向大家介绍Lua 命名参数,包括了Lua 命名参数的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 在代码中我发现: 类雇员不是我们的类,可能从wsdl文件生成,其中参数(年龄和地点)被称为,,所以有人试图命名null参数以知道哪个是哪个,但这是好的做法吗?另一个问题是,和被翻译,而其他两个参数只是,但除此之外,创建带有值的变量只是为了将其传递到构造函数的下一行,可以吗?

  • 您可以传递命名参数以及相关值。 语法 (Syntax) export default Ember.Helper.helper(function([value],namedArgs) { //code here }); 例子 (Example) 下面给出的示例将命名参数以及相关值传递给帮助程序。 创建两个helper作为namedarguments和namedarguments1 。 打开在

  • 问题内容: 在PHP 4/5中是否可以在调用时指定一个命名的可选参数,从而跳过您不想指定的参数(例如在python中)? 就像是: 谢谢 问题答案: 不,这是不可能的:如果要传递第三个参数,则必须传递第二个参数。并且命名参数也不可能。 一种“解决方案”是只使用一个参数,一个数组并始终传递它……但不要总是在其中定义所有内容。 例如 : 并这样称呼: 将获得以下输出: 但是我真的不喜欢这个解决方案:

  • 本文向大家介绍PowerShell中对函数参数的命名建议,包括了PowerShell中对函数参数的命名建议的使用技巧和注意事项,需要的朋友参考一下 PowerShell自定义函数的参数没有具体的命名规则,那么怎么做才能让参数的命名更加科学可持续。 我们应该怎么来命名函数的参数名称呢?有没有一个可供参考的列表?当然微软没有给出来。但是我们可以来理一个列表出来。微软自带了大量的cmdlet,这些cmd