【问题标题】:Is this syntax formatting normal for Java?这种语法格式对于 Java 是否正常?
【发布时间】:2018-04-17 17:52:55
【问题描述】:

Google Protocol Buffers Tutorial 看到这段 Java 代码:

Person john =
  Person.newBuilder()
    .setId(1234)
    .setName("John Doe")
    .setEmail("jdoe@example.com")
    .addPhones(
      Person.PhoneNumber.newBuilder()
        .setNumber("555-4321")
        .setType(Person.PhoneType.HOME))
    .build();

我用Java编程已经有一段时间了,但我对这种形式并不熟悉。我了解Person John = Person.newBuilder(),但.setId.setName 等不是newBuilder 的参数,也不是彼此终止的。也许它只是有趣的缩进。另外, .setId(1234) 是否暗示了 john.setId(1234)?

【问题讨论】:

标签: java syntax


【解决方案1】:

这是一种称为“流利界面”的模式,通常在 Builders 中用于支持您的问题中的代码流。

简单的技巧是从 setter 返回“this”,因此可以直接链接新方法调用。它与语法无关,在这方面,它只是组织代码的另一种方式。

class Foo {
    public Foo() {}

    public Foo a () { /* do something and */ return this; }
    public Foo b () { /* do something else and */ return this; }
}

new Foo().a().b().a();

这基本上是相同的模式。

【讨论】:

  • 我现在从那里的最后一行看到它。我理解方法链接很好,但这种格式让我不知何故;我应该记得 Java 不关心空格。我想我太“放大”了,不得不退后一步。公认。谢谢!
【解决方案2】:

这种格式格式在大多数代码中并不完全正常,但是当您使用构建器时,这很常见,因为使用构建器的一部分是能够链接调用以看起来像您发布的可读性。

它取代了一个很长的参数列表,该列表也往往有奇怪的格式。

点表示对上一行方法返回值的调用(注意,每行以“.”开头的前一行没有分号)。每个构建器方法都返回“this”,因此可以以这种方式链接它。

如果对可读性不感兴趣,您的示例可以这样重写:

PersonBuilder johnBuilder = Person.newBuilder();
johnBuilder.setId(1234);
johnBuilder.setName("John Doe");
johnBuilder.setEmail("jdoe@example.com");
PhoneBuilder phoneBuilder = Person.PhoneNumber.newBuilder();
phoneBuilder.setNumber("555-4321");
phoneBuilder.setType(Person.PhoneType.HOME);
johnBuilder.addPhones(phoneBuilder);
Person john = johnBuilder.build();

这种模式是由对“Person”不可变的愿望驱动的——为了不可变,所有参数都必须传递给构造函数,这使得构造函数难以理解。这将其分解以显示每行传递的内容。 .build() 行调用 Person 构造函数,传入您放入构建器的所有值并返回一个不可变的 Person,“john”

完全不使用构建器,它看起来像这样:

Person John = new Person (1234, "John Doe", "jdoe@example.com", new Person.PhoneNumber("555-4321", Person.PhoneType.HOME));

Person John = new Person (
   1234, 
   "John Doe", 
   "jdoe@example.com", 
   new Person.PhoneNumber(
       "555-4321", 
       Person.PhoneType.HOME
   )
);

如果您查看您的示例,您应该会发现它比这更具可读性,并且随着参数列表的增长,它会变得更糟。

【讨论】:

  • 这就是我要说的。从你随处可见的意义上说,这不是“正常的”,但它很常见,以至于并不真正值得注意。这是一些人使用的风格。
  • 其他人先到达那里,但为等效结构 +1。很清楚。
猜你喜欢
  • 2023-04-10
  • 2014-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 2011-08-08
  • 2016-12-13
  • 1970-01-01
相关资源
最近更新 更多