我正在尝试创建一种多策略生成器
。我的意思是这个构建器应该是通用的,并且应该根据实体类型有不同的方法。让我解释一下。
根据实体的不同,我们需要不同的方法。示例:
Builder<User> userBuilder;
userBuilder.withName(«Bob»);
userBuilder.withAge(17);
并且这个构建器必须没有其他方法!
Builder<Account> accountBuilder;
accountBuilder.withCounry(«Fr»);
accountBuilder.withNumber(2846218354);
accountBuilder.withCode(«X34»);
我应该使用什么模式?以及如何组织我的设计?
最佳答案
如果您要一个 Builder
类型不需要知道任何有关它所操作的实体的信息,Java 无法按照您描述的方式轻松做到这一点。在 Builder<User>
例如,withName
和withAge
需要在编译时知道方法。
由于这些方法实际上并不存在,但需要动态添加,因此您必须编写一个自定义类加载器。一旦Builder
类是链接的,您无法更改它,并且由于在您传入实体之前它不知道您想要什么方法,因此在您需要添加方法时更改为时已晚。
您可以通过使用反射来实现大部分目标。例如,您可以在Builder
中有一个方法。比如说,with(String field, Class<?> c, Object value)
。然后,假设您正在构建的对象实例有一个名为“set___”的方法,您可以使用 Method
类以使用传入的值调用相应的 set 方法。
看起来像:
Builder<Account> b = new Builder<>();
b.with("AccountNumber", String.class, "5897-1048-2949");
// this invokes "setAccountNumber" method on internal
// Account instance with "5897-1048-2949" cast to String
更好的主意是为您要构建的东西创建类:AccountBuilder
, UserBuilder
, 等等。这更清晰,并且可能是您在 Java 中可以做的最好的事情,而无需求助于自定义类加载器等奇异的解决方案。 (是的,您必须为每一个编写属性。)
但是,如果您决定需要进行大量构建,您可能需要考虑一种替代语言,使其更容易实现,例如 Ruby或Elixir 。动态方法不是 Java 的强项,并且试图规避语言的限制只是为了实现特定的 API 通常是一个糟糕的主意。
关于java - 如何创建一个可以构建多种 Java 对象的 Builder?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25912679/