Java继承,使用生成器模式

各位晚上好,

我有3类:

  1. 错误
  2. ShellError
  3. WebError

哪里

ShellError extends Error

WebError extends Error

ShellError有字段其中一些是可选的,并且其他是必需的。 我建立以下列方式对象:

shellError = new ShellError.Builder().setFile(filePattern) .setHost(host).setPath(path).setSource(file.isSource()) .setJobName(p.getJobName()).build();

由于ShellError扩展了Error ,我进一步:

shellError.setDescription(msg.toString()); shellError.setExceptionClass("MyEvilException"); shellError.setExceptionMessage("Some clever error message"); shellError.setStacktrace(stack);

所以...为什么用生成器烦? 我喜欢这样的事实,我的版本()除其他事项外方便地验证所有字段都正确设置等。

我会喜欢它,如果我能..建() ShellError ,并添加到它从田野Error类。

我所做的工作。

  • 问题是:

有没有更好的办法,或者是否有意义我做了什么?

- 编辑

更新生成器()我接受其中一些人的错误中前级参数。 我现在有

shellError = new ShellError.Builder(exception, "Some description").setFile(filePattern).setHost(host) .setPath(path).setSource(file.isSource()). setJobName(p.getJobName()).build();

你说什么? 更好? 更糟糕的?

--------------解决方案-------------

根据您所提到的功能,这显然不是标准java.lang.Error类。 通常,制造商正在使用,以便可以很容易地构造一个不可变对象或提供类似于在有很多的配置/结构参数的情况下“命名参数”的功能。

对于这种特殊的情况下,这将是比较明智​​的,如果Error类是施工后不可变的,如果这些额外的setter函数分别对建设者而不是在错误类。 我不知道你有多大的控制对任何这些类的,但如果你可以修改它们,我建议首先制造商支持相同的制定者,所以你可以在建设者做的所有配置。 然后,如果可行的话,你可以尝试删除这些setter方法​​,而是让这些必须从构造配置。 如果你没有任何控制都对这些,你可以有可能与另外一个支持这些额外的方法扩展生成器类。

你做了什么有意义。 这似乎是建设者和错误类的设计并不一定能使一大堆的道理,逼着你写,感觉不雅或不一致的代码。

Builder模式,通过乔希布洛赫普及,有几个好处,但它没有对父/子如此优雅的工作,因为在C#世界在这次讨论中解释了我们的同事。 到目前为止,我所见过的最好的解决方案是这样的一个(或它的一个微不足道的变种)。

正如有人已经说过,建设者模式不是东西,可以有机地融入现有的Java对象的初始化政治。 有几种方法来实现所需的结果。 虽然,当然,它始终是更好地避免任何模棱两可的做法,它并不总是可能的。 我的破解是基于Java的泛型反射API:

abstract public class AbstractClass {

public static class Builder {

public <T extends AbstractClass> T build(Class<T> implementingClass) {
try {
Constructor<T> constructor = implementingClass
.getConstructor(new Class[]{Builder.class});
return constructor.newInstance(this);
} catch (NoSuchMethodException e) {
// TODO handle the exception
} catch (InvocationTargetException | InstantiationException |
IllegalAccessException e) {
// TODO handle the exception
}
}
}

protected AbstractClass(Builder builder) {

}
}

public class ImplementingClass extends AbstractClass {

public ImplementingClass (Builder builder) {
super(builder);
}
}

初始化:

ImplementingClass instance = new AbstractClass.Builder()
.build(ImplementingClass.class);

分类:java的 时间:2015-03-15 人气:1
本文关键词: Java中,继承
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.871 (s). 10 q(s)