java - IntelliJ IDEA : simple way to create type-safe builder without plugins?

标签 java intellij-idea

我想使用 IntelliJ IDEA 创建一个 POJO 类,以帮助我避免犯愚蠢的错误,例如以错误的方式获取参数。

  • 我不关心其他 IDE
  • 我不想使用任何形式的反射(即没有 Lombok 或类似的)
  • 我不关心 JavaBean 标准
  • 我不关心“最佳实践”

我只想创建一个类,声明一些字段并有一种方便的方法来创建所述类,以减少我在创建类时以错误的方式获得相同类型参数的可能性。

从这里开始:

public class TestObject {
  public String x;
  public String y; 
}

我想生成一些我可以使用的东西,就像这样:

TestObject o = new TestObject().setX("x").setY("y");

或者这个:

TestObject o = TestObjectBuilder.withX("x").withY("y").build();

我不介意是否有一个单独的构建器类(更喜欢将所有方法都放在原始类上,但没什么大不了的)。

我不介意它一路上复制很多份。更喜欢整个过程只创建 1 个实例,就像我下面的解决方案一样;但是,如果解决方案采用不可变实例每个 setter 字段的方法 - 没什么大不了的。


以下是我目前为实现这一目标所做的工作。

(1) 使用IDEA生成构造函数,选择所有字段,结果如下:

public class TestObject {
  public String x;
  public String y;

  public TestObject(String x, String y) {
    this.x = x;
    this.y = y;
  }
}

(2) Refactor Constructor with Builder,必须选择Use existing,然后复制/粘贴TestObject 名称进入字段,因为为什么不,导致:

public class TestObject {
  public String x;
  public String y;

  public TestObject(String x, String y) {
    this.x = x;
    this.y = y;
  }

  public TestObject setX(String x) {
    this.x = x;
    return this;
  }

  public TestObject setY(String y) {
    this.y = y;
    return this;
  }

  public TestObject createTestObject() {
    return new TestObject(x, y);
  }
}

(3) 手动删除构造函数(因为它的存在拒绝使用默认构造函数)并删除 createTestObject() 方法(因为它是多余的,Java 免费给了我一个克隆方法)。留给我这个小美女,这是我最初想要的:

public class TestObject {
  public String x;
  public String y;

  public TestObject setX(String x) {
    this.x = x;
    return this;
  }

  public TestObject setY(String y) {
    this.y = y;
    return this;
  }
}

怎么样,Obi-wan Stack-overflow,有没有一种方法可以做到这一点而不是胡扯?

我希望能够做的另一件事是添加字段,而不是胡扯。目前,当我添加一个字段时,我正在执行 generate setter 手动修改结果以与其他 setter 保持一致 - 有更好的方法吗?

最佳答案

是的,这是可能的。

  1. 按 Alt-Insert(或“代码”->“生成”)打开“生成”菜单
  2. 选择二传手。
  3. 在下一个窗口中,在名为“Template”的顶部下拉菜单中选择“Builder”(默认情况下它是“intellij Default”)。

您将获得与您想要的完全相同的结果。

关于java - IntelliJ IDEA : simple way to create type-safe builder without plugins?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54361811/

相关文章:

java - 如何在另一个字符串中查找字符串并忽略小写/大写?

Java 枚举-替代映射

Java:空指针双端队列迭代器

intellij-idea - 由于 Lombok 用法,无法在 Intellij Idea 13 EAP/12.1.5 中编译项目

java - 如何使用 FastVehicleRoutingTransportCostsMatrix ,我有时间矩阵?

java - 使用 Spring RestTemplate 对对象进行 POST 参数

java - 如何将 IntelliJ Evaluate Expression 工具与 lambda 和外部作用域一起使用?

java - 无法在 IntelliJ 中启动 Spring Boot +thymeleaf 应用程序

java - 在 IntelliJ 文件搜索中忽略大文件

java - 通过maven将.jar文件添加到类路径