簡體   English   中英

使用構建器模式、Cucumber-JVM 和 Guice 了解不變性

[英]Understanding immutability with builder pattern and Cucumber-JVM and Guice

我在我的項目中使用cucumber-jvmcucumber-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()方法中修改它的狀態?

您可以修改狀態,因為構建器模式未正確實現。 在構建器模式中:

  • 你沒有在你的班級中提供 mutators(或 setter)。 設置類屬性的唯一方法是通過構建器。 只能通過 builder 構造函數或通過 builder 的 mutator 方法設置屬性。 通常對於必填字段,您通過構建器構造函數初始化它們,然后使用構建器 setter 方法設置其他可選屬性。

所以你的帶有構建器模式的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM