【问题标题】:Java Builder Utility Class?Java Builder 实用程序类?
【发布时间】:2021-09-29 14:57:44
【问题描述】:

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

我理解如何使用 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();

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

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

【问题讨论】:

  • 为什么你需要一个不需要实例化的类的构建器?拥有一个构建器背后的想法是创建对象的新实例,因此对于没有实例的类没有意义。
  • @AndyTurner 当我添加 public static Builder ...我仍然必须使用 new 这个词才能使用它...这就是我要避免的...
  • @akortex - 为什么?因为我的“伸缩”类构造函数失控了......我想保持使用没有实例化的类的现有风格,因为实际上在这种情况下,必须创建类的实例破坏了它的全部目的存在...而且我意识到构建器是用于创建新类...这就是我问这个问题的原因...
  • @AndyTurner - 不,我想与类进行交互,而无需使用任何 = 或单词 new ... 完全公共的静态类... 贯穿始终
  • @AndyTurner - 不正确...实用程序类不需要实例化即可使用其中的方法...

标签: java class javabuilders


【解决方案1】:

您可以使用 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();
}

在这里查看lombok

添加如下依赖来管理它

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

【讨论】:

  • 你不需要龙目岛。 Lombok 只需创建 Builder 代码。他已经有了密码。这并没有回答他的问题。
猜你喜欢
  • 1970-01-01
  • 2012-08-27
  • 2013-06-14
  • 1970-01-01
  • 1970-01-01
  • 2021-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多