这种语法格式化对Java正常吗?

这种语法格式化对Java正常吗?,java,syntax,Java,Syntax,从中发现以下Java代码块: 我已经有一段时间没有用Java编程了,但是我不熟悉这个表单。我理解Person John=Person.newBuilder(),但.setId、.setName等不是newBuilder的参数,也不是在彼此之间终止的。也许这只是一个有趣的缩进。另外,john.setId(1234)是否暗示了.setId(1234)?这种格式在大多数代码中并不完全正常,但当您使用构建器时,它是非常常见的,因为使用构建器的一部分是能够链接调用,使其看起来像您发布的可读性 它替换了一个

从中发现以下Java代码块:


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

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

它替换了一个很长的参数列表,该列表的格式也很奇怪

点表示调用前一行中方法的返回值(请注意,每行以“.”开头的前一行没有分号)。每个构建器方法都返回“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 John = new Person (1234, "John Doe", "jdoe@example.com", new Person.PhoneNumber("555-4321", Person.PhoneType.HOME));
这种模式的驱动力是希望“Person”是不可变的——为了不可变,所有参数都必须传递给构造函数,这使得构造函数很难理解。这将对其进行分解,以显示每行传递的内容。.build()行调用Person构造函数,将您输入的所有值传入该构造函数,并返回一个不可变的Person,“john”

如果根本不使用构建器,它将如下所示:

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 John = new Person (1234, "John Doe", "jdoe@example.com", new Person.PhoneNumber("555-4321", Person.PhoneType.HOME));


如果你看一下你的例子,你会发现它比这个更可读,随着参数列表的增长,情况会变得更糟。

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

它替换了一个很长的参数列表,该列表的格式也很奇怪

点表示调用前一行中方法的返回值(请注意,每行以“.”开头的前一行没有分号)。每个构建器方法都返回“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 John = new Person (1234, "John Doe", "jdoe@example.com", new Person.PhoneNumber("555-4321", Person.PhoneType.HOME));
这种模式的驱动力是希望“Person”是不可变的——为了不可变,所有参数都必须传递给构造函数,这使得构造函数很难理解。这将对其进行分解,以显示每行传递的内容。.build()行调用Person构造函数,将您输入的所有值传入该构造函数,并返回一个不可变的Person,“john”

如果根本不使用构建器,它将如下所示:

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 John = new Person (1234, "John Doe", "jdoe@example.com", new Person.PhoneNumber("555-4321", Person.PhoneType.HOME));

如果你看一下你的例子,你会发现它比这个更易读,而且随着参数列表的增长,它会变得更糟。

这是一种称为“流畅接口”的模式,通常在构建器中使用,以支持像你问题中那样的代码流

简单的技巧是从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();
这基本上是相同的模式。

这是一种称为“流畅接口”的模式,通常在构建器中使用,以支持您的问题中所述的代码流

简单的技巧是从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();

这基本上是相同的模式。

请看和。请看和。这就是我要说的。从你随处可见的意义上说,这不是“正常的”,但它已经足够普遍,不值得注意。这是一些人使用的一种风格。其他人先到了那里,但是对于同等的结构+1。很清楚,这就是我要说的。从你随处可见的意义上说,这不是“正常的”,但它已经足够普遍,不值得注意。这是一些人使用的一种风格。其他人先到了那里,但是对于同等的结构+1。很清楚,我从最后一行看到了。我完全理解方法链接,但这种格式让我放弃了任何原因;我应该记得Java不在乎空格。我想我太“放大”了,不得不后退。认可的。谢谢我现在从最后一行看到了。我完全理解方法链接,但这种格式让我放弃了任何原因;我应该记得Java不在乎空格。我想我太“放大”了,不得不后退。认可的。谢谢