- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我现在正在为我的公司创建一个大项目,其中包含大量数据结构和文件。我正在为我的以下问题寻找一个好的解决方案:
由于 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/
C语言sscanf()函数:从字符串中读取指定格式的数据 头文件: ?
最近,我有一个关于工作预评估的问题,即使查询了每个功能的工作原理,我也不知道如何解决。这是一个伪代码。 下面是一个名为foo()的函数,该函数将被传递一个值并返回一个值。如果将以下值传递给foo函数,
CStr 函数 返回表达式,该表达式已被转换为 String 子类型的 Variant。 CStr(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CSng 函数 返回表达式,该表达式已被转换为 Single 子类型的 Variant。 CSng(expression) expression 参数是任意有效的表达式。 说明 通常,可
CreateObject 函数 创建并返回对 Automation 对象的引用。 CreateObject(servername.typename [, location]) 参数 serv
Cos 函数 返回某个角的余弦值。 Cos(number) number 参数可以是任何将某个角表示为弧度的有效数值表达式。 说明 Cos 函数取某个角并返回直角三角形两边的比值。此比值是
CLng 函数 返回表达式,此表达式已被转换为 Long 子类型的 Variant。 CLng(expression) expression 参数是任意有效的表达式。 说明 通常,您可以使
CInt 函数 返回表达式,此表达式已被转换为 Integer 子类型的 Variant。 CInt(expression) expression 参数是任意有效的表达式。 说明 通常,可
Chr 函数 返回与指定的 ANSI 字符代码相对应的字符。 Chr(charcode) charcode 参数是可以标识字符的数字。 说明 从 0 到 31 的数字表示标准的不可打印的
CDbl 函数 返回表达式,此表达式已被转换为 Double 子类型的 Variant。 CDbl(expression) expression 参数是任意有效的表达式。 说明 通常,您可
CDate 函数 返回表达式,此表达式已被转换为 Date 子类型的 Variant。 CDate(date) date 参数是任意有效的日期表达式。 说明 IsDate 函数用于判断 d
CCur 函数 返回表达式,此表达式已被转换为 Currency 子类型的 Variant。 CCur(expression) expression 参数是任意有效的表达式。 说明 通常,
CByte 函数 返回表达式,此表达式已被转换为 Byte 子类型的 Variant。 CByte(expression) expression 参数是任意有效的表达式。 说明 通常,可以
CBool 函数 返回表达式,此表达式已转换为 Boolean 子类型的 Variant。 CBool(expression) expression 是任意有效的表达式。 说明 如果 ex
Atn 函数 返回数值的反正切值。 Atn(number) number 参数可以是任意有效的数值表达式。 说明 Atn 函数计算直角三角形两个边的比值 (number) 并返回对应角的弧
Asc 函数 返回与字符串的第一个字母对应的 ANSI 字符代码。 Asc(string) string 参数是任意有效的字符串表达式。如果 string 参数未包含字符,则将发生运行时错误。
Array 函数 返回包含数组的 Variant。 Array(arglist) arglist 参数是赋给包含在 Variant 中的数组元素的值的列表(用逗号分隔)。如果没有指定此参数,则
Abs 函数 返回数字的绝对值。 Abs(number) number 参数可以是任意有效的数值表达式。如果 number 包含 Null,则返回 Null;如果是未初始化变量,则返回 0。
FormatPercent 函数 返回表达式,此表达式已被格式化为尾随有 % 符号的百分比(乘以 100 )。 FormatPercent(expression[,NumDigitsAfterD
FormatNumber 函数 返回表达式,此表达式已被格式化为数值。 FormatNumber( expression [,NumDigitsAfterDecimal [,Inc
我是一名优秀的程序员,十分优秀!