【问题标题】:the keyword "final" for BigDecimal.java [closed]BigDecimal.java 的关键字“final”[关闭]
【发布时间】:2017-04-18 12:17:23
【问题描述】:

众所周知,java中的不可变类应该通过关键字“final”来修改。但是,为什么 BigDecimal.java 类是异常?

【问题讨论】:

  • immutable != final - immutable 表示无法更改实例的值,而final 表示您无法创建子类。还有其他不可变但非最终类,如 java.util.Date 等。

标签: java keyword final bigdecimal


【解决方案1】:

不可变意味着,该类不包含任何会改变其内部状态的方法。

不可变类示例:

class ImmutableInteger {
    private final int value;

    public ImmutableInteger(int value) {this.value = value;}

    public int value() {return value;}

    public ImmutableInteger add(int a) {
        // instead of changing this state, we will create new instance with result
        return new ImmutableInteger(value + a);
    }
}

可变类示例:

class MutableInteger {
    private int value;

    public MutableInteger(int value) {this.value = value;}

    public int value() {return value;}

    public MutableInteger add(int a) {
        value += a; // mutating internal state
        return this;
    }
}

修饰符 final 表示,该变量不能更改。对于对象类型的变量,这意味着该变量不能引用其他对象。对于原始类型(byte、short、int、long、float、double)的变量,表示该值不能改变。

BigDecimal a = new BigDecimal(1);
BigDecimal b = a.add(new BigDecimal(1)); // returns result in new instance (a is not changed = immutable)
a = new BigDecimal(5); // ok, 'a' is not final = can be change to refer to other BigDecimal instance)

final BigDecimal b = new BigDecimal(1);
BigDecimal c = b.add(new BigDecimal(2)); // // returns result in new instance (a is not changed = immutable)
b = new BigDecimal(5); // NOT OK!!!, 'b' is final = can not be changed to refer to other object

【讨论】:

  • 谢谢,我明白了。
  • @ValueYouth 如果有帮助,请随时将此答案标记为“已接受”:)
【解决方案2】:

没有。没有。没有。

finalnot 是否意味着您不能通过该引用修改对象。

当应用于引用时,final 表示不能将引用更改为引用不同的对象。它不等同于 C++ 的 const 限定符。

不变性意味着没有提供修改对象状态的方法。

【讨论】:

    【解决方案3】:

    为什么 BigDecimal.java 类是异常?

    不是,final关键字意味着你只是不能改变bigdecimal的引用,你仍然可以改变对象的值...

    final BigDecimal myDec = BigDecimal.valueOf(1L);
    System.out.println(myDec);
    myDec = myDec.plus(); //invalid, you cant change the ref
    

    这里要考虑的一点是 BigDecimal 是不可变的,因此所有更改对象内容的操作也将返回 BigDecimal 的新实例。 ..

    【讨论】:

      【解决方案4】:

      也不例外。 BigDecimal 本身是immutable,因为这个方法都没有修改对象值。 但是您可以更改变量引用。

      BigDecimal bd = new Bigdecimal(10);
      bd = bd.add(new BigDecimal(50)); // bd new equals 60
      


      如果您声明您的 BigDecimal final,您将无法再更改引用。

      final BigDecimal bd = new Bigdecimal(10);
      final total = bd.add(new BigDecimal(50)); // Total new equals 60
      // bd = bd.add(new BigDecimal(50)); // Will FAIL
      

      【讨论】:

        猜你喜欢
        • 2012-12-30
        • 1970-01-01
        • 1970-01-01
        • 2016-08-14
        • 2017-04-24
        • 1970-01-01
        • 2011-12-10
        • 2010-10-22
        • 1970-01-01
        相关资源
        最近更新 更多