lombok @Builder 与构造函数
lombok @Builder vs constructor
有人可以向我解释一下使用 lombok
@Builder
创建对象而不是构造函数调用的优点吗?
MyObject o1 = MyObject.builder()
.id(1)
.name("name")
.build();
MyObject o2 = new MyObject(1, "name")
是否只是提高能见度的问题?
这不是 lombok 的特定功能,这称为 builder pattern.
假设您有一个带有 20 个参数的 class,其中 10 个是可选的。你可以用某种方式让大量的构造函数处理这个逻辑,或者用所有这些参数创建一个构造函数并在某些地方传递空值。建造者模式不是更简单吗?
考虑:
Order order = new Order("Alan", "Smith", 2, 6, "Susan", "Smith");
参数是什么意思?我们必须查看构造函数规范才能找到答案。
现在有一个建造者:
Order order = Order.builder()
.originatorFirstName("Alan")
.originatorLastName("Smith")
.lineItemNumber(2)
.quantity(6)
.recipientFirstName("Susan")
.recipientLastName("Smith")
.build();
它比较罗嗦,但读起来很清楚,而且在 IDE 的帮助下,写起来也很容易。编写构建器本身有点繁琐,但像 Lombok 这样的代码生成工具可以帮助解决这个问题。
有些人争辩说,如果您的代码需要构建器来提高可读性,那就是暴露了其他的味道。您使用了太多基本类型;您在一个 class 中放置了太多字段。例如,考虑:
Order order = new Order(
new Originator("Alan", "Smith"),
new ItemSet(new Item(2), 6),
new Recipient("Susan", "Smith"));
...这是不言自明的,无需使用构建器,因为我们正在使用更多 class 具有单一职责和更少字段的元素。
有人可以向我解释一下使用 lombok
@Builder
创建对象而不是构造函数调用的优点吗?
MyObject o1 = MyObject.builder()
.id(1)
.name("name")
.build();
MyObject o2 = new MyObject(1, "name")
是否只是提高能见度的问题?
这不是 lombok 的特定功能,这称为 builder pattern.
假设您有一个带有 20 个参数的 class,其中 10 个是可选的。你可以用某种方式让大量的构造函数处理这个逻辑,或者用所有这些参数创建一个构造函数并在某些地方传递空值。建造者模式不是更简单吗?
考虑:
Order order = new Order("Alan", "Smith", 2, 6, "Susan", "Smith");
参数是什么意思?我们必须查看构造函数规范才能找到答案。
现在有一个建造者:
Order order = Order.builder()
.originatorFirstName("Alan")
.originatorLastName("Smith")
.lineItemNumber(2)
.quantity(6)
.recipientFirstName("Susan")
.recipientLastName("Smith")
.build();
它比较罗嗦,但读起来很清楚,而且在 IDE 的帮助下,写起来也很容易。编写构建器本身有点繁琐,但像 Lombok 这样的代码生成工具可以帮助解决这个问题。
有些人争辩说,如果您的代码需要构建器来提高可读性,那就是暴露了其他的味道。您使用了太多基本类型;您在一个 class 中放置了太多字段。例如,考虑:
Order order = new Order(
new Originator("Alan", "Smith"),
new ItemSet(new Item(2), 6),
new Recipient("Susan", "Smith"));
...这是不言自明的,无需使用构建器,因为我们正在使用更多 class 具有单一职责和更少字段的元素。