使用具有4个表达式的三元运算符

时间:2009-11-29 10:28:13

标签: java variables null ternary-operator

这是一种可接受的编码习惯吗?

public class MessageFormat {
    private static final Color DEFAULT_COLOR = Color.RED;

    private Color messageColor = DEFAULT_COLOR;

    public MessageFormat(Person person) {
        Color color = person.getPreferredColor();
        messageColor = (color != null) ? color : messageColor; // this line
    }
}

或者我最好选择经典......

if (color != null) {
    messageColor = color;
}

8 个答案:

答案 0 :(得分:24)

应限制使用?:运算符以使代码更具可读性。一个典型的例子:

a = sprintf( "There are %i green bottle%s on the wall.", i, (i==1?"":"s") );

在这种情况下,如果将代码分成大约5个if / else行,则代码的可读性会降低。

我通常在整个运算符周围放置括号,以便在阅读时我会将其作为单个值进行心理解析。

 messageColor = (color != null ? color : messageColor); 

另一种变体是

messageColor = color || messageColor;

在某些语言中哪些会评估为“颜色,除非颜色评估为”false“,在这种情况下,messageColor的值。在我看来,这应该避免,因为它可能会让人感到困惑。

最重要的是要保持一致,以便下一个阅读代码的人(即使是你)具有最低的认知开销。

答案 1 :(得分:4)

在这种情况下,可读性,易于理解等是相同的(我的意思是,来吧...... )。我不喜欢第一个例子中的重复和明显的自我分配;它会转化为:

if (colour != null) {messageColour = colour;}
   else {messageColour = messageColour;};

这有点愚蠢。

我通常会把第二行写成一行,但这是一个个人花哨的问题。编码风格指南:

if (colour != null) {messageColour = colour;};

编辑(我现在比8年前更加自以为是)

因为您正在寻找最佳实践:

// Use default visibility by default, especially in examples.
// Public needs a reason.
class MessageFormat {
    static final Color DEFAULT_COLOR = Color.RED;

    // Strongly prefer final fields.
    private final Color messageColor;

    // Protect parameters and variables against abuse by other Java developers
    MessageFormat (final Person person) {
        // Use Optionals; null is a code smell
        final Optional<Color> preferredColor = person.getPreferredColor();
        // Bask in the clarity of the message
        this.messageColor = preferredColor.orElse(DEFAULT_COLOR);
    }
}

答案 2 :(得分:2)

使用三元运算符通常是一个敏感问题,以及其他编码标准。它的使用可能最好取决于您网站的编码标准。

然而,在这种特定情况下,我肯定会推荐第二种选择;不仅更清楚,而且这里完全不需要使用三元运算符。没有必要为自己重新分配messageColor,因此在这种特殊情况下三元运算符的唯一功能是代码混淆。

答案 3 :(得分:2)

三元运算符在C程序员中比较常见。在C中如果你避开控制结构,你通常可以获得更好的流水线,因为没有分支预测出错。我怀疑你会看到Java中的任何性能差异,而if-null-then-assign模式比三元模型更常见。但是,如果要维护现有代码库,通常最好与现有代码保持一致。

如果您发现自己经常这样做,可以编写defaultIfNullfirstNonNullcoalesce函数,这可以使代码更简洁。 Apache Commons Lang includes a defaultIfNull function.

某些语言包含||=运算符,这是这些语言中默认值的惯常惯用法。

答案 4 :(得分:1)

我更喜欢第二种,因为它更清楚地表达了你的意思:你只想改变颜色,如果它不是空的。第一种方法并没有这么清楚。

答案 5 :(得分:1)

三元运营商经常被滥用,因为他们生产的代码看起来很聪明和紧凑。

实际上,它们使代码的可读性降低,更容易出错。

建议使用较长版本

 if ( <condition> ) {
     <action> ;
 }

而不是三元语法。

答案 6 :(得分:1)

在你的情况下,我更喜欢'经典'的实现,因为对我来说理解起来更快,如果这个人有一个新的颜色,你只想使用一种新的颜色。

如果我想避免NPE,我有时会在方法调用中使用它,但我通常会在下一个重构中删除那些丑陋的代码;)

答案 7 :(得分:0)

对我来说似乎很好(我经常使用Python的三元运算符),但这种风格问题通常非常主观。如果项目有编码样式文档,您可能需要检查它。