为什么在使用 BigInteger 时不需要使用 new 关键字或括号?



当你在Java中创建一个类的实例时,你会使用:

Class nameOfClass = new Class();

它创建了一个对象,然后您可以通过在对象名称后面添加一个句点来调用它的方法。为什么在使用BigInteger时不需要使用新的关键字或括号,并且可以通过以下方式创建新对象:

BigInteger first = BigInteger.valueOf(1);

我浏览了这里的文档,以及许多谷歌搜索,以找出为什么这毫无用处。

这是一个静态工厂方法,它返回BigInteger的一个实例。

public static BigInteger valueOf(long val) 
{
         if (val == 0)
             return ZERO;
         if (val > 0 && val <= MAX_CONSTANT)
             return posConst[(int) val];
         else if (val < 0 && val >= -MAX_CONSTANT)
             return negConst[(int) -val];
         return new BigInteger(val);
}

请看,它要么返回一个new BigInteger(val),要么通过BigInteger数组实例成员返回一个已经存在的BigInteger。作为参考,这里是创建数组的静态块:

private static BigInteger posConst[] = new BigInteger[MAX_CONSTANT+1];
private static BigInteger negConst[] = new BigInteger[MAX_CONSTANT+1]
static 
{
    for (int i = 1; i <= MAX_CONSTANT; i++) 
    {
        int[] magnitude = new int[1];
        magnitude[0] = i;
        posConst[i] = new BigInteger(magnitude,  1);
        negConst[i] = new BigInteger(magnitude, -1);
     }
}

这被称为工厂方法。一个static方法,它为您创建并返回一个新对象。

当你有很多创建对象的方法,但不想过多地重载方法签名(即有不同的构造函数)时,它们很方便

这是一个静态工厂方法。一种用于创建和返回新对象的静态方法。因此,您可以创建一个static方法,该方法在内部调用new操作

这是因为BigInteger.valueOf方法是一个静态工厂方法。这意味着该方法本身只用于创建BigInteger的单个实例。这个链接很好地描述了何时使用静态方法:Java:何时使用静态方式

BigInteger使用factory method模式来创建具有更有意义的方法名称的新实例。工厂方法还允许JVM重用通常可重用值(如1)的同一实例以节省内存。

顺便说一句,你可以使用new关键字来构造新的实例,但构造函数采用了许多参数或字符串,这可能会令人困惑。

最新更新