如何修复类“Shape”暴露在其定义的可见性范围之外的警告?(爪哇17)

hon*_*ong 8 java enums warnings visibility function

我在第 17 行创建了函数“warn”,其参数是枚举 Shape。为什么会发出有关可见性范围的警告以及如何修复它?

import java.util.Scanner;

public class AreaCalculator {

    enum Shape {TRIANGLE, RECTANGLE, CIRCLE}
    static Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) {
        String str = scanner.next();

        while (!str.equals("quit")){
            str = str.toUpperCase();
            warn(Shape.valueOf(str));
        }
    }

    public static void warn(Shape shape) { //warning

    }
Run Code Online (Sandbox Code Playgroud)

Intellij 建议生成具有默认参数值的重载方法,如以下代码。

public static void warn(){
    warn(null);
}
Run Code Online (Sandbox Code Playgroud)

但我认为这看起来并不直观。

tgd*_*ies 15

为什么会有警告Class 'Shape' is exposed outside its defined visibility scope

因为方法enum AreaCalculator.Shape只对同一个包中的类可见,但方法public static void warn(Shape shape)对任何类都可见。

所以如果我们写一个类:

package a;

import b.AreaCalculator;

public class AreaCalculatorClient {
    public static void main(String[] args) {
        AreaCalculator.warn(AreaCalculator.Shape.CIRCLE);
    }
}
Run Code Online (Sandbox Code Playgroud)

它将无法编译,因为'b.AreaCalculator.Shape' is not public in 'b.AreaCalculator'. Cannot be accessed from outside package.

修复方法是Shape公开或warn包私有,具体取决于您的意图。

Shape如果您确信已为 选择了正确的可见性,但又想warn从任意类中调用类似该方法的内容,则可以执行 IntelliJ IDEA 建议的修复。

  • @hong:有一个专门的按钮,意思是“喜欢这个答案”,这是赞成按钮,你应该按下它(事实上,这比将其作为评论发布更好)。此外,如果它有助于解决您的问题,也请随意接受该问题。 (3认同)