如何修复类“Shape”超出其定义的可见性范围的警告?(爪哇 17)

How can i fix warning that Class 'Shape' is exposed outside its defined visibility scope? (JAVA 17)

提问人:hong 提问时间:9/18/2023 最后编辑:hong 更新时间:9/19/2023 访问量:3339

问:

我在第 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

    }

Intellij 建议使用默认参数值生成重载方法,如以下代码所示。

public static void warn(){
    warn(null);
}

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

Java 函数 枚举 警告 可见性

评论

1赞 Jorn 9/18/2023
做或不做。enum Shapepublicwarnpublic
0赞 Slaw 9/18/2023
设为公共,或将包设为私有(或私有)。Shapewarn
0赞 Kayaman 9/18/2023
你已经学到了一些重要的东西,当像IntelliJ(或SonarQube)这样的静态分析工具提出建议时,它可能会删除警告,但以一种非常愚蠢的方式。

答:

10赞 tgdavies 9/18/2023 #1

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

因为 方法只对同一包中的类可见,但该方法对任何类都是可见的。enumAreaCalculator.Shapepublic static void warn(Shape shape)

因此,如果我们编写一个类:

package a;

import b.AreaCalculator;

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

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

解决方法是使用“设为公共”或“包私有”,具体取决于您的意图。Shapewarn

IntelliJ IDEA 建议的修复程序是您可以执行的操作,如果您确信您已经为 选择了正确的可见性,但您想从任意类中调用类似该方法的东西。Shapewarn

评论

0赞 hong 9/18/2023
我喜欢你的回答!谢谢:)
2赞 Joachim Sauer 9/18/2023
@hong:有一个专门的按钮,上面写着“喜欢这个答案”,这是点赞按钮,你可能应该按下它(事实上,这比将其作为评论发布更可取)。此外,如果它有助于解决您的问题,请随时接受该问题。
0赞 Reilas 9/19/2023 #2

"...我在第 17 行中设置了函数“warn”,其参数是枚举 Shape。为什么要警告可见性范围以及如何解决它?..."

我在这里没有收到任何警告,代码编译。
如果我输入任何一个值,我会得到一个无限循环。

要解决此问题,请在每次 while 循环迭代时分配 str

String str;

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

输出

TRIANGLE
TRIANGLE
RECTANGLE
RECTANGLE
CIRCLE
CIRCLE
quit