gpt4 book ai didi

java - 在 Java 中封装构建器

转载 作者:行者123 更新时间:2023-11-30 06:10:41 24 4
gpt4 key购买 nike

我的代码库中有 2 个构建器,可以像这样访问它们:

return new Developer.Builder("John", "Doe").age(30).build();
return new Manager.Builder("Eve", "Page").age(40).build();

我想通过封装在枚举中来简化 API:

return Google.Developer.Builder("John", "Doe").age(30).build();
return Google.Manager.Builder("Eve", "Page").age(40).build();

我的目标是简化流程

  1. 将公司名称从 Google 更改为 Microsoft
  2. 如果添加了新角色(开发人员和经理除外),我的代码的用户可以在一个地方了解它。

我想到的唯一选择是将公司名称作为枚举 - 但那样我将无法实现构建器模式。

最佳答案

您可以创建一个类似于您所描述的 API:

enum Google {
Developer, Manager;

public Builder builder(String name) {
return new Builder(this, name);
}

public static class Builder {
public Builder(Google role, String name) { ... }
public Builder age(int age) { ... }
public Employee build() { ... }
}
}

现在你可以写了

Employee e = Google.Developer.builder("John").age(30).build();

我不明白这一切有什么意义。构建者是否以某种重要的方式依赖于公司和角色?

如果没有,您可以将 Builder 定义为一个单独的类,并使用一个接口(interface)来标记曾经代表公司角色的内容,类似于 Sleiman 的回答。如果这在您的应用程序中有意义,您甚至可以将 Employee 类参数化...

interface CompanyRole { /* just a marker */ }

enum Google implements CompanyRole {
...
Employee.Builder<Google> builder(String name) {
return new Employee.Builder<>(this, name);
}
}

class Employee<T extends CompanyRole> {
...

static class Builder<T extends CompanyRole> {
EmployeeBuilder(T role, String name) { ... }
Employee<T> build() { ... }
}
}

你还可以写

Employee<Google> e = Google.Developer.builder("John").age(30).build();

关于java - 在 Java 中封装构建器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35562906/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com