Java 构造函数返回null的替代方法
我现在正在为我的公司创建一个大项目,有很多数据结构和垃圾。我正在为以下问题寻找一个好的解决方案: 因为Java不可能让构造函数返回null(至少我的研究表明是这样),所以我需要一个好的替代方法 假设我有以下代码(只是一个示例,实际项目更复杂): getChild(字符串名)函数来自jdom2(XML解析器),用于读取XML文件。如果找不到具有给定名称的子级,它可以并将返回null。 我在这个例子的基础上编写了我的项目,愚蠢地认为,如果命名函数返回null,那么变量(例如这里的bar1)也将是null。但由于命名函数是用“newbar(…)”包装的,所以它不会为null,而是一个空对象。 但是我希望并且需要“空”变量为null,这样在迭代项目中的所有数据结构时可以轻松跳过这些变量。 我会将“getChild(…)”函数返回的对象保存到局部变量“leElement”中,然后得到如下结果:Java 构造函数返回null的替代方法,java,performance,jdom,Java,Performance,Jdom,我现在正在为我的公司创建一个大项目,有很多数据结构和垃圾。我正在为以下问题寻找一个好的解决方案: 因为Java不可能让构造函数返回null(至少我的研究表明是这样),所以我需要一个好的替代方法 假设我有以下代码(只是一个示例,实际项目更复杂): getChild(字符串名)函数来自jdom2(XML解析器),用于读取XML文件。如果找不到具有给定名称的子级,它可以并将返回null。 我在这个例子的基础上编写了我的项目,愚蠢地认为,如果命名函数返回null,那么变量(例如这里的bar1)也将是nu
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静态方法是不可重写的,因此