[英]Understanding immutability with builder pattern and Cucumber-JVM and Guice
我在我的項目中使用cucumber-jvm
和cucumber-guice
進行測試自動化。 我有一個帶有構建器模式的 POJO:
class Book {
String title;
String author;
String date;
// builder, getter, setter
}
然后,在黃瓜測試中,我需要在兩個步驟中共享Book
對象的狀態:
class BookSteps {
@Inject
Book book;
void firstStep() {
buildBook();
}
void secondStep() {
buildBook().setDate("2019-09-04");
}
Book buildBook() {
return book = Book().BookBuilder().title("Foo").author("Bar").build();
}
}
因此,正如我正確理解構建器模式的那樣,它創建了一個不可變的book
對象。 但是,為什么我能夠通過在其上調用setDate()
並最終修改它來在secondStep()
方法中修改它的狀態?
您可以修改狀態,因為構建器模式未正確實現。 在構建器模式中:
所以你的帶有構建器模式的 Book 類應該如下所示:
public class Book {
private String title;
private String author;
private String date;
private Book(Builder builder) {
title = builder.title;
author = builder.author;
date = builder.date;
}
public String getTitle() {
return title;
}
public String getAuthor() {
return author;
}
public String getDate() {
return date;
}
public static final class Builder {
private String title;
private String author;
private String date;
public Builder() {
}
public Builder title(String val) {
title = val;
return this;
}
public Builder author(String val) {
author = val;
return this;
}
public Builder date(String val) {
date = val;
return this;
}
public Book build() {
return new Book(this);
}
}
}
下面是測試類:
public class TestBookBuilder {
public static void main(String[] args) {
Book book = new Book.Builder().title("Book title").author("Book Author").date("25-01-2020").build();
}
}
現在 Book 類的實例是不可變的。
希望它有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.