我现在为我的公司创建了一个大项目,有很多数据结构和shizle。我正在为以下问题寻找一个好的解决方案:
由于Java不可能让构造函数返回null(至少我的研究说过),我需要一个很好的替代方法。
我们说我有以下代码(只是一个例子。实际项目更复杂):
public abstract class SuperClass
{
public SuperClass(Element element)
{
if(element != null)
readElement(element);
}
public abstract void readElement(Element element);
}
public class Foo extends SuperClass
{
private Bar bar1;
private Bar bar2;
private Bar bar3;
//...
public Foo(Element element)
{
super(element);
}
@Override
public void readElement(Element element)
{
this.bar1 = new Bar(element.getChild("bar1"));
this.bar2 = new Bar(element.getChild("bar2"));
this.bar3 = new Bar(element.getChild("bar3"));
//...
}
}
public class Bar extends SuperClass
{
private String value;
public Bar(Element element)
{
super(element);
}
@Override
public void readElement(Element element)
{
this.value = element.getChildText("value");
}
}
Element.getChild(String name)函数来自jdom2(XML-Parser),用于读取xml文件。如果找不到具有给定名称的子节点,它可以并且将返回null。 我在这个例子的基础上写了我的项目,愚蠢地想,如果命名函数返回null,那么变量(例如bar1)也是null。但由于命名函数包含了一个" new Bar(...)"它不会是null,而是一个空对象。 但我想要并且需要"空"变量为null,因此我可以在迭代项目中的所有Datastructures时轻松跳过这些变量。 我会保存返回的对象来自" getChild(...)"将函数转换为局部变量" lElement"然后有类似的东西:
if(lElement != null)
bar1 = lElement;
但是我有超过50种不同的数据结构,就像我的例子中那些,并且其中包含足够多的变量,这些数据由" readElement(...)"初始化。功能。这个想法需要太多的编辑,甚至可能需要相当多的性能。它似乎有点......"丑陋"为了我。至少对于这个数量的变量。所以我需要一些东西,它对性能没有任何影响,并且像构造函数返回null一样容易。我不想在这些功能中改变过多的代码。 如果" Element元素"我还想让Datastructure将自己设置为null。等于null,但经过快速研究后,这个想法立即被删除^^。删除自己的对象无法工作,无论如何都不符合逻辑。
基本上我可以自己解决这个问题。但可能它不是最有效的方式。两者都在努力编辑代码和代码性能。 所以我问你们,你们将如何解决这个问题。在我的例子中不仅仅考虑了两个简单的Datastructures,而是使用这个系统的50个类+。
我希望你能帮助我,我为任何糟糕的英语道歉。我来自德国^^。 到目前为止,我已经用Java编写了5年以上的编码("专业"自去年以来),所以对我来说有点尴尬,因为我没有想到这个问题。但现在回到完全不同的东西已经太晚了。
提前谢谢!
答案 0 :(得分:0)
返回null
的构造函数的替代方法是返回null
的工厂方法。
虽然你不能写
class SomeClass {
public SomeClass(Node node) {
if (node.isEmpty()) return null; // Does not compile
...
}
}
你当然可以这样写:
class SomeClass {
private SomeClass(Node node) {
// Self-check: this should never happen
if (node.isEmpty()) {
throw new IllegalArgumentException("node");
}
...
}
public static SomeClass makeFromNode(Node node) {
if (node.isEmpty()) {
return null;
}
return new SomeClass(node);
}
}
通过调用makeFromNode
替换构造函数调用,可以让您以简单统一的方式处理节点null
的情况。
答案 1 :(得分:0)
构造函数定义任意对象的初始化。因此他们永远不会返回价值观。
我认为缺少一个hasElement方法是一个主要的设计缺陷,但是如果你坚持返回null,你可以。
在任何情况下,您都应该利用泛型和方法引用(> = Java 8)。
您可以在代码示例中使用wrap方法来满足您的要求(使用继承来允许子类更容易地读取子类)。
public void readElement(Element element) {
this.bar1 = wrap(element.getChild("bar1"), Bar::new);
this.bar2 = wrap(element.getChild("bar1"), Bar::new);
this.bar3 = wrap(element.getChild("bar1"), Bar::new);
}
protected <T> T wrap(Element element, Function<Element, T> elem) {
if (element == null) {
return null; // Not a good value
}
return elem.apply(element);
}