返回null

时间:2017-05-05 15:26:28

标签: java performance jdom

我现在为我的公司创建了一个大项目,有很多数据结构和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年以上的编码("专业"自去年以来),所以对我来说有点尴尬,因为我没有想到这个问题。但现在回到完全不同的东西已经太晚了。

提前谢谢!

2 个答案:

答案 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);
}