gpt4 book ai didi

java - 返回 null 的构造函数的替代方案

转载 作者:太空宇宙 更新时间:2023-11-04 11:30:57 25 4
gpt4 key购买 nike

我现在正在为我的公司创建一个大项目,其中包含大量数据结构和文件。我正在为我的以下问题寻找一个好的解决方案:

由于 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 文件。如果没有找到具有给定名称的 child ,它可以并且将会返回 null。我根据这个例子编写了我的项目,愚蠢地认为,如果命名函数返回 null,则变量(例如这里的 bar1)也将为 null。但由于命名函数是用“new Bar(...)”包装的,因此它不会为空,而是一个空对象。但我希望并且需要“空”变量为空,这样在迭代项目中的所有数据结构时我可以轻松跳过这些变量。我会将“getChild(...)”函数返回的对象保存到局部变量“lElement”中,然后得到如下内容:

if(lElement != null)
bar1 = lElement;

但我有超过 50 个不同的数据结构,如我的示例中的数据结构,其中有足够多的变量,这些变量是由“readElement(...)”函数初始化的。这个想法需要太多的编辑,甚至可能需要相当多的性能。而且对我来说似乎有点……“丑陋”。至少对于这么多的变量来说是这样。所以我需要一些对性能没有任何影响的东西,并且就像让构造函数返回 null 一样简单。我不想对这些函数中的代码进行太多更改。我也有过如果“Element element”等于 null 则让 Datastruct 自身设置为 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 的情况。

关于java - 返回 null 的构造函数的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43808665/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com