簡體   English   中英

Java 生成器實用程序 Class?

[英]Java Builder Utility Class?

我一直在谷歌上搜索了一段時間,試圖找到這個問題的答案,但沒有成功。

我理解如何使用 Builder 樣式創建 class 的方式是這樣的:

public class MyClass {

    private String myString;
    private int myInt;

      public static class Builder {

        private String myString;
        private int myInt;
  
        public Builder() {}
    
        public Builder setString(String myString) {
          this.myString = myString;
          return this;
        }

        public Builder setInteger(int myInt) {
          this.myInt = myInt;
          return this;
        }

        public MyClass build() {
          return new MyClass(this);
        }

    private MyClass(Builder build) {
      this.myString = build.myString;
      this.myInt = build.myInt;
    }
}

這很棒。 這是class設計的強大風格,但是,我想做什么。 有一個實用程序 class,其中所有內容都是 static 和公共的,但也有一個構建器來設置 class,但我似乎能夠做到這一點的唯一方法。 是通過創建構建器 class 的新實例,它強制用戶在父 class 上調用 new ..,但不應實例化父 class。 因此,擁有一個必須為 class 實例化的 Builder 似乎有點令人困惑,而 class 卻沒有..,我能夠為公用事業 class 提供任何類型的構建器的唯一方法是返回 void on最后的構建語句。 所有構建選項都會影響父 class 的更改...

所以我的問題是,有沒有辦法在公共 static 實用程序 class 上提供“生成器樣式”功能,這樣在使用該功能時根本不需要實例化任何 class?

編輯:

我想我應該澄清一下,我試圖向 class 的最終用戶提供的是調用 Builder 樣式接口而根本不實例化任何類的能力......像這樣:

MyClass.Builder.option1().option2().build();

注意我沒有這樣做:

MyClass myClass = new MyClass.Builder()...

因為那正是我不想做的......

編輯2:

以下面的class為例:

import java.util.*;

class MyClass {

    private static List<String>            userList       = new ArrayList<>();
    private static Map<Integer, String>    userMap        = new HashMap<>();
    private static LinkedList<Double>      userDoubleList = new LinkedList<>();
    private static Map<Integer, SomeClass> someClassMap   = new HashMap<>();

    public static void method1(String userString) {
        userList.add(userString);
    }

    public static void method2(Integer userNumber, String userString) {
        userMap.put(userNumber, userString);
    }

    public static void method3(Double userDouble) {
        userDoubleList.addLast(userDouble);
    }

    public static void method4(Integer userInteger, SomeClass userClass) {
        someClassMap.put(userInteger, userClass);
    }
}

我希望用戶能夠使用這樣的 Builder 樣式設置 class:

MyClass.Builder.option1("My String").option3(25.4).build();

或者無論如何最終看起來......我希望能夠讓他們設置 class 的參數,而無需創建一大堆不同的公共 static 方法,這些方法提供 class 中固有的各種選項...

我希望這是有道理的...

您可以使用 Lombok 輕松生成 Builders

在您的 class 上使用注解 @Builder

@Builder
public class MyClass {
    private String myString;
    private int myInt;
}

然后你可以像下面的代碼一樣使用它:

public void foo(){
   MyClass myClass = MyClass.builder().myInt(0).myString("bar").build();
}

在這里看看龍目島

添加如下依賴來管理它

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <scope>provided</scope>
    <version>1.18.20</version>
</dependency>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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