使用"new"关键字(Java)

Nov*_*ice 1 java oop

我对Java编程相对较新,并且面向对象方面存在一个小问题.那么,让我们来吧!我最近编写了一个程序来查找0和数字x之间的所有素数,其中"i"是素数.在该程序中,两条线与以下相同.

  BigInteger one = BigInteger.valueOf(i);
    one = one.nextProbablePrime();
Run Code Online (Sandbox Code Playgroud)

这些行的目的是将整数i转换为BigInteger以使用nextProbablePrime方法.回想一下,我看到我没有使用关键字"new",因此没有创建BigInteger类的实例,但程序仍然编译并运行顺利.为什么程序能够使用nextProbablePrime方法,如果没有创建BigInteger类的实例,则编译并运行?此外,不会在其他情况下以及使用其他类和方法创建对象.此外,它是否会阻止我使用BigInteger类的全部功能,它是否被认为是良好的编程习惯?

我还将上面的两行代码重写为两行代码,使程序的其余部分保持不变.

BigInteger one = new BigInteger(String.valueOf(i));
    one = one.nextProbablePrime();  
Run Code Online (Sandbox Code Playgroud)

我改变了两者的第一行,包括使用"新"这个词.正如我所料,它没有任何缺陷.回到我的其他问题,哪一个更好?哪一个会给我最大的功能,尽管我正在使用的类或方法,哪一个被认为是更好的做法?

总而言之,我的问题是:1.哪一个是正确的? 2. 尽管我正在使用的课程或方法,哪一个适用于所有情况? 3. 哪一个被认为是良好的编程习惯? 4. 第一个如何在不创建对象的情况下工作?

快速链接到Biginteger类,对于那些可能想要查看它的人 - 在这里

Lou*_*man 15

确实创建了BigInteger该类的实例.这只是该new关键字的某处使用内部的实施BigInteger.valueOf方法.

BigInteger.valueOf通常更有效率.它可以BigInteger为某些值重用相同的对象i- 可能是0,或者可能是Integer.valueOf(int),它从-128到128.

BigInteger.valueOf被称为工厂方法,它们经常被推荐.除此之外,工厂方法可以有名称,构造函数不能; 他们对实施有更多的控制权; 有很多很好的理由.实际上,Effective Java中的第一个建议是"考虑静态工厂方法而不是构造函数".

如果你真的仰望的源代码BigInteger.valueOf,你可以看到,这是它在做什么:它检查是否它可以重复使用一个恒定值- ZERO或小的正或负的价值-做不到这一点,它只是向前走,并呼吁new BigInteger(value),虽然它使用内部私有构造函数,long而不是使用String.valueOf.