0

我一直在谷歌搜索一段时间,试图找到这个问题的答案,但没有成功。

我理解如何使用 Builder 样式创建类的方式是这样的:

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;
    }
}

太棒了!它是一种强大的类设计风格。但是,我想做的是有一个实用程序类,其中所有内容都是静态和公共的,但也有一个构建器来设置该类。但我似乎能够做到这一点的唯一方法是创建一个构建器类的新实例,该实例强制用户在父类上调用 new ...但父类不应该被实例化,所以有一个必须为一个没有实例化的类的构建器似乎有点令人困惑......我能够为公共实用程序类提供任何类型的构建器的唯一方法是在最终构建语句,其中所有构建选项都会影响父类的更改...

所以我的问题是,有没有办法在公共静态实用程序类上提供“生成器样式”功能,这样在使用该功能时根本不需要实例化任何类?

编辑:

我想我应该澄清一下,我试图为该类的最终用户提供的是能够调用 Builder 样式接口而不实例化任何类的能力......就像这样:

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

注意我没有这样做:

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

因为这正是我不想做的......

编辑2:

以下面的类为例:

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 样式设置类:

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

或者最终实际上看起来......我希望能够让他们设置类的参数,而无需创建一大堆不同的公共静态方法,这些方法提供了类中固有的各种选项...

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

4

1 回答 1

0

您可以使用 Lombok 轻松制作 Builders

在你的类上使用注解 @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>
于 2021-09-29T15:22:25.320 回答