Java 哪种编码方式更好

Java 哪种编码方式更好,java,Java,这似乎是个愚蠢的问题。我只是想知道哪种编码方式更好 备选案文1: if(a==null) { a=getA(); return a; } else { return a; } 备选案文2: if(a==null) { a=getA(); } return a; 变量a是一个静态变量,用于缓存getA()并避免多次调用它。第二个变量更简洁,因此可能会更好,但这是一个主观问题,没有人能给你一个特别客观的答案。无论您喜欢或适合您的团队,编码标准都是答案 正如已经指出

这似乎是个愚蠢的问题。我只是想知道哪种编码方式更好

备选案文1:

if(a==null) {
    a=getA();
    return a;
} else {
    return a;
}
备选案文2:

if(a==null) {
    a=getA();
}
return a;

变量a是一个静态变量,用于缓存getA()并避免多次调用它。

第二个变量更简洁,因此可能会更好,但这是一个主观问题,没有人能给你一个特别客观的答案。无论您喜欢或适合您的团队,编码标准都是答案

正如已经指出的,有一个较短的方法可以做到这一点:

return a!=null ? a : getA();

但是,这完全取决于你和你的团队喜欢什么。就我个人而言,我更喜欢你展示的第二种方式,因为它更具可读性(在我看来)。

还有第三种选择,它甚至更短——使用三元条件运算符:

return a != null ? a : getA();

编辑:我假设
a
是一个局部变量,因此如果
null
则不必赋值。另一方面,如果它是一个用作缓存的实例变量(为了避免多次调用
getA()
),则需要将
getA()
的结果分配给
a
,在这种情况下,我会使用第二个选项,因为它更短,因此更清晰(您仍然可以在赋值时使用三元条件运算符-
返回a!=null?a:(a=getA());
,但我发现这一点不太清楚。)

我更喜欢第二种选择,因为只有一个
return
语句,这有助于调试(您只需要输入一个断点,而不是两个断点)。而且,您在第一选择中可以说是在复制代码

但在这种情况下,我更喜欢使用三元条件:


返回a==null?getA():a;

我假设
a
是类成员,
getA()
是创建
a
实例的方法

最好的解决方案应该是将此逻辑推送到被调用的方法中。换句话说,而不是:

void someFunction() {
    // logic
    if(a==null) {
        a=getA();
    }
    return a;
}

A getA() {
    // creation logic of instance A
    return newAInstance;
}
你应该:

void someFunction() {
    // logic

    return getA();
}

A getA() {
    if(a == null) {
        // creation logic of instance A
    }
    return a;
}

方法调用的成本是最小的,并且在实例化
a
时不必处理。

我更喜欢第二个选项,最佳实践是在一个方法中只有一个返回语句。这将是更可读的代码。

您是否忘记了第二个示例中的条件?是的,对不起……我将它的seem添加为m基本上是基于观点的(我更喜欢选项2),没有“最佳”的编码方式,但由于第二种代码基本上与较少的代码相同,所以我选择第二种。但您应该始终检查代码的可读性,在我看来,可读性比较少的代码更重要。我认为这将始终调用getA()方法。getA()是一个庞大的方法,需要大量资源,并且总是返回相同的输出。不,这不是真的:在Java中只对三元条件中的一个选项进行求值。(参见VB6中的
iif
,它对双方都求值。)虽然我喜欢这种风格,但可能需要注意的是getA()的值存储在初始请求中,但不在此解决方案中。我们不知道a用于何处,也不知道它以后用于何处。@是的,我添加了一条关于此的注释。如果getA和a之间没有关系,这可能是有意义的,但getA对我来说似乎是a的实例实例化器。这种逻辑应该推送到getA和n中对于每次调用getA,使用三元运算符看起来会更好。但是如果我没有错的话,它不会存储getA()的值。每次调用getA()都是浪费资源感谢您的建议…但是我没有修改getA()方法的权限。仅供参考,getA()方法实际上给了我一个巨大的哈希图。@ NitishVasu,你可以在你自己的类中包装一个类,它将调用Super。GETA(),除非它已经被加载。考虑它。