Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 构造函数返回null的替代方法_Java_Performance_Jdom - Fatal编程技术网

Java 构造函数返回null的替代方法

Java 构造函数返回null的替代方法,java,performance,jdom,Java,Performance,Jdom,我现在正在为我的公司创建一个大项目,有很多数据结构和垃圾。我正在为以下问题寻找一个好的解决方案: 因为Java不可能让构造函数返回null(至少我的研究表明是这样),所以我需要一个好的替代方法 假设我有以下代码(只是一个示例,实际项目更复杂): getChild(字符串名)函数来自jdom2(XML解析器),用于读取XML文件。如果找不到具有给定名称的子级,它可以并将返回null。 我在这个例子的基础上编写了我的项目,愚蠢地认为,如果命名函数返回null,那么变量(例如这里的bar1)也将是nu

我现在正在为我的公司创建一个大项目,有很多数据结构和垃圾。我正在为以下问题寻找一个好的解决方案:

因为Java不可能让构造函数返回null(至少我的研究表明是这样),所以我需要一个好的替代方法

假设我有以下代码(只是一个示例,实际项目更复杂):

getChild(字符串名)函数来自jdom2(XML解析器),用于读取XML文件。如果找不到具有给定名称的子级,它可以并将返回null。 我在这个例子的基础上编写了我的项目,愚蠢地认为,如果命名函数返回null,那么变量(例如这里的bar1)也将是null。但由于命名函数是用“newbar(…)”包装的,所以它不会为null,而是一个空对象。 但是我希望并且需要“空”变量为null,这样在迭代项目中的所有数据结构时可以轻松跳过这些变量。 我会将“getChild(…)”函数返回的对象保存到局部变量“leElement”中,然后得到如下结果:

if(lElement != null)
    bar1 = lElement;
但是我有50多个不同的数据结构,比如我的例子中的数据结构和足够多的变量,它们是由“readElement(…)”函数初始化的。这个想法需要太多的编辑,甚至可能需要相当多的性能。而且似乎有点。。。对我来说“丑陋”。至少对于这个数量的变量。所以我需要一些对性能没有任何影响的东西,就像让构造函数返回null一样简单。我不希望在这些函数中更改太多代码。 我也有一个想法,如果“Element Element”等于null,那么让数据结构自身设置为null,但是经过快速研究,这个想法立即被删除了。一个删除他自己的对象将不起作用,而且无论如何也不符合逻辑

所以基本上我可以自己解决这个问题。但这可能不是最有效的方式。无论是在代码编辑方面还是在代码性能方面。 所以我问你们,你们将如何解决这个问题。回想一下,不只是像我的例子中那样的两个简单的数据结构,而是使用这个系统的50多个类

我希望你能帮助我,我为任何糟糕的英语道歉。我来自德国。 到目前为止,我已经用Java编写了5年多的代码(从去年开始是“专业的”),所以我有点尴尬,因为我之前没有想到这个问题。但现在回到完全不同的话题已经太晚了


提前谢谢你

构造函数返回
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
的情况。

构造函数返回
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
的情况。

构造函数定义任意对象的初始化。因此,它们永远无法返回值

我认为缺少hasElement方法是一个主要的设计缺陷,但是如果您坚持返回null,您可以

在任何情况下,您都应该利用泛型和方法引用(>=Java8)

您可以在代码示例中针对给定的需求使用wrap方法(使用继承使子类更容易读取子类)

public void readElement(元素){
this.bar1=wrap(element.getChild(“bar1”),Bar::new);
this.bar2=wrap(element.getChild(“bar1”),Bar::new);
this.bar3=wrap(element.getChild(“bar1”),Bar::new);
}
受保护的T形包装(元件、功能元件){
if(元素==null){
返回null;//不是一个好值
}
返回元素应用(元素);
}

构造函数定义任意对象的初始化。因此,它们永远无法返回值

我认为缺少hasElement方法是一个主要的设计缺陷,但是如果您坚持返回null,您可以

在任何情况下,您都应该利用泛型和方法引用(>=Java8)

您可以在代码示例中针对给定的需求使用wrap方法(使用继承使子类更容易读取子类)

public void readElement(元素){
this.bar1=wrap(element.getChild(“bar1”),Bar::new);
this.bar2=wrap(element.getChild(“bar1”),Bar::new);
this.bar3=wrap(element.getChild(“bar1”),Bar::new);
}
受保护的T形包装(元件、功能元件){
if(元素==null){
返回null;//不是一个好值
}
返回元素应用(元素);
}

啊,这实际上是一种很好的方法。更改所有调用将是一项相当大的工作,但实际上它不会改变性能,而且似乎需要(至少我认为是这样)最少的更改调用的工作,因为我有一个顶级类,可以在其中添加静态函数。非常感谢你!又学到了新东西^^^啊……等等。这可能没那么容易。我有很多不同的数据结构,它们被称为。它们都有不同的getter。因此,我需要手动为每个类创建方法,因为(在我的原始post示例中)超类没有函数,但Bar将有一个getValue()方法,例如…我是否遗漏了一些内容,或者我无法将您的方法写入一个超类中,所以我不需要手动为每个类创建它?@Apahdos静态方法是不可重写的,因此