为什么我在构造函数中获取可覆盖方法调用的警告,什么都没有被覆盖?

时间:2014-08-07 21:22:42

标签: java netbeans

我收到警告“承包商可覆盖的方法调用”,我不知道为什么。该课程不会extendimplement。当我点击建议的警告时 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;
}

3 个答案:

答案 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. 注解
  2. 公共,受保护或私人
  3. abstract static final synchronized native strictfp

答案 1 :(得分:1)

您收到该警告是因为您在构造函数中调用了doTests()。由于其他人可以扩展您的类并更改功能,因此您无法保证它实际上会按照您的预期执行操作。在构造函数中使用可覆盖的方法是一种产生不一致/意外对象状态的上帝方法。

要删除警告,请将方法设为最终,将其设为私有,或使类最终完成。

使类最终意味着没有其他对象可以固有。使方法成为最终意味着没有子类可以更改方法的定义。将该方法设为私有意味着根本没有其他对象可以与它交互(因此无法更改它)。

如果没有其他类需要该方法,可以将其设为私有。否则,最好的方法可能是使方法最终。

答案 2 :(得分:0)

通常你根本不想让任何人改变你的构造函数。您在代码中所做的就是允许他们......

当有人为你的类创建子类并调用super(int,int,int,int)时,doTests();在子类上调用call。所以有人可以改变基类的构造函数的部分工作。