Я сделал функцию «предупреждение» в строке 17, параметр которой — enum 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);
}
Но мне кажется, это не выглядит интуитивно понятным.
Сделайте Shape
общедоступным или сделайте warn
пакет частным (или частным).
Вы узнали что-то важное: когда инструмент статического анализа, такой как IntelliJ (или SonarQube), предлагает что-то, он может удалить предупреждение, но очень глупым образом.
Почему предупреждение 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);
}
}
Он не сможет скомпилироваться, потому что 'b.AreaCalculator.Shape' is not public in 'b.AreaCalculator'. Cannot be accessed from outside package
.
Решение состоит в том, чтобы сделать Shape
общедоступным или warn
приватным для пакета, в зависимости от ваших намерений.
Исправление, предложенное IntelliJ IDEA, — это то, что вы можете сделать, если вы убеждены, что выбрали правильную видимость для Shape
, и все же хотите вызвать что-то вроде метода warn
из произвольных классов.
Мне нравится твой ответ! Спасибо :)
@hong: есть специальная кнопка с надписью «нравится этот ответ», которая является кнопкой «за»; вам, вероятно, следует нажать ее (на самом деле это предпочтительнее, чем публиковать ее в качестве комментария). Кроме того, если это помогло решить вашу проблему, не стесняйтесь принять и этот вопрос.
«... Я создал функцию «warn» в строке 17, параметром которой является перечисление Shape. Зачем предупреждать об области видимости и как это исправить? ...»
Я не получаю никаких предупреждений, код компилируется.
Если я введу любое из значений, я получу бесконечный цикл.
Чтобы решить эту проблему, назначайте str на каждой итерации цикла while.
String str;
while (!(str = scanner.nextLine()).equals("quit")){
str = str.toUpperCase();
warn(Shape.valueOf(str));
}
Выход
TRIANGLE
TRIANGLE
RECTANGLE
RECTANGLE
CIRCLE
CIRCLE
quit
Сделайте
enum Shape
public
илиwarn
неpublic
.