为什么Java的BigInteger将TEN和ONE作为常量?有实际用途吗?

Har*_*til 59 java

为什么BigInteger类具有常量TEN和ONE?将它们作为常数的任何实际用途?我可以理解ZERO的一些用例.

Mus*_*enç 51

假设您编写了一个函数,该函数BigInteger在一些计算和数据库操作之后返回.您可能经常需要返回null,0,1等值.它很容易返回BigInteger.ZERO.这些值是公开的,因为它们通常是需要的.

public BigInteger findMyLovelyBigInteger(Integer secretNumber) {
    if (secretNumber == null) {
        return BigInteger.ZERO; // better than BigInteger.valueOf(0);
    } else {
        // some db operations
    }
}
Run Code Online (Sandbox Code Playgroud)

BigInteger.TEN常用于电源/分频/模块操作.

结帐BigInteger公共方法.您将很容易看到他们的常见用例.

  • @Andy如果你已经处理过BigInteger对象,使用定义的常量可以节省自动装箱/拆箱和创建新对象的需要.如果在某些循环中使用数千次,可能会有好处. (10认同)
  • @Andy因为`BigInteger.TEN`比`BigInteger.valueOf(10)`清楚得多.特别是如果你"导入静态"它. (5认同)
  • 那么BigInteger.TEN在BigInteger公共方法中使用的位置是什么? (4认同)
  • 正如答案所写,BigInteger.TEN通常用于电源/除法/模块操作. (4认同)
  • 为什么要使用BigInteger.TEN而不是10? (4认同)

mik*_*era 21

一个可能是数学中最基本的数字(除了零).似乎在这一点上应该得到自己的常数.实际上,在许多算法中作为常量使用它是一个有用的数字.

Ten在BigInteger上下文中很重要,因为它是十进制数字系统的基础.这很重要,因为有几个BigInteger函数需要一个基数(例如BigInteger.toString(int radix),它因此是一个非常有用的常量).

  • @DenisTulskiy他们今天可能会被缓存*,但他们是在1996年Java 1.1出现时缓存的吗?因为*那是多么荒谬的是打扰认真回答这个问题. (4认同)
  • 除了'TEN`是一个'BigInteger`,而不是一个int,所以对于那些方法它根本没用. (3认同)
  • 如果在内部使用TEN,为什么要公开? (3认同)
  • @ cx0der显式需要是重用现有的值对象. (3认同)
  • BigInteger.TEN比BigInteger.valueOf(10)快; (3认同)
  • @ cx0der:为什么不公开? (2认同)

Pet*_*Mmm 11

恕我直言,这是一个设计决定,因为1和10用于Java API代码库的其他部分.创建Big*是一项昂贵的操作,并且使用常量来避免创建新对象(Big*无论如何都是不可变的)并且代码更具可读性.

API的其余部分可能不需要其他常量.

将它们公之于众可能是一个错误.(java API充满了"糟糕"的设计决策)

  • @Ingo据我所知,BigInteger在任何版本的JDK中都没有任何mutator方法或公共字段(除了静态常量).这也可以防止你通过继承使它变得可变,所以它并不需要是最终的. (3认同)
  • @Ingo你能详细说明一下吗?Javadoc以"不可变的任意精度整数"开头. (2认同)

Puc*_*uce 5

我其实不知道,但也许:

也许他们只是在内部使用这些常数?(我没有检查源代码,但它是开源的).

编辑:

例如:

在查看代码后,我认为原因是因为它们在内部使用了ZERO和ONE.考虑到上述原因,可能认为其他人也可能从这些常数中获益.或者他们也可以在其他一些类中使用这些常量.

在v1.5中添加了TEN它似乎没有在内部使用,但可能是由另一个类?

http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/00cd9dc3c2b5/src/share/classes/java/math/BigInteger.java