我收到警告“承包商可覆盖的方法调用”,我不知道为什么。该课程不会extend
或implement
。当我点击建议的警告时
1.让课程最终
2.使方法最终
3.使方法静态
4.将方法设为私有
为什么会发生这种情况,我该怎么办?以下是相关代码:
import java.util.Random;
public class Tester {
public Tester(int minLength, int maxLength, int minValue, int maxValue)
{
rand = new Random();
int[] randData = generateArray(minLength, maxLength, minValue, maxValue);//overridable method call in constructor
procArr = new DataManager(randData);
doTests();//overridable method call in constructor
}
public void doTests()
{
procArr.sort();
}
public int[] generateArray(int minLenght, int maxLength, int minVal, int maxVal)
{
final int length = getRandomVal(minLenght, maxLength);
int arr[] = new int[length];
for(int i = 0; i < length; i++)
arr[i] = getRandomVal(minVal, maxVal);
return arr;
}
private int getRandomVal(int min, int max)
{
int n = max - min + 1;
int i = rand.nextInt(n);
return min + i;
}
final private Random rand;
final private DataManager procArr;
}
答案 0 :(得分:2)
因为它可以覆盖。将其设为私人或最终。
private int[] generateArray(int minLenght, int maxLength, int minVal, int maxVal)
{
final int length = getRandomVal(minLenght, maxLength);
int arr[] = new int[length];
for(int i = 0; i < length; i++)
arr[i] = getRandomVal(minVal, maxVal);
return arr;
}
警告并没有抱怨您确实覆盖了某个方法。它抱怨别人可以。这对CTOR来说是不好的,因为那时你的CTOR会调用一种神知道什么的方法。通常从CTOR调用的方法是私有的。有时候你想让他们公开,所以如果他们是公开的,也要把它们作为最终决定。
编辑:Re。你的问题&#34;我注意到你在方法签名中的最终位置并不重要,例如public final void doTests()或final public void doTests()。有首选方式吗?&#34;
是的。 Java语言规范says the preferred order is:
答案 1 :(得分:1)
您收到该警告是因为您在构造函数中调用了doTests()
。由于其他人可以扩展您的类并更改功能,因此您无法保证它实际上会按照您的预期执行操作。在构造函数中使用可覆盖的方法是一种产生不一致/意外对象状态的上帝方法。
要删除警告,请将方法设为最终,将其设为私有,或使类最终完成。
使类最终意味着没有其他对象可以固有。使方法成为最终意味着没有子类可以更改方法的定义。将该方法设为私有意味着根本没有其他对象可以与它交互(因此无法更改它)。
如果没有其他类需要该方法,可以将其设为私有。否则,最好的方法可能是使方法最终。
答案 2 :(得分:0)
通常你根本不想让任何人改变你的构造函数。您在代码中所做的就是允许他们......
当有人为你的类创建子类并调用super(int,int,int,int)时,doTests();在子类上调用call。所以有人可以改变基类的构造函数的部分工作。