Как я могу исправить предупреждение о том, что класс «Форма» доступен за пределами определенной области видимости? (ЯВА 17)

Я сделал функцию «предупреждение» в строке 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);
}

Но мне кажется, это не выглядит интуитивно понятным.

Сделайте enum Shapepublic или warn не public.

Jorn 18.09.2023 10:44

Сделайте Shape общедоступным или сделайте warn пакет частным (или частным).

Slaw 18.09.2023 10:44

Вы узнали что-то важное: когда инструмент статического анализа, такой как IntelliJ (или SonarQube), предлагает что-то, он может удалить предупреждение, но очень глупым образом.

Kayaman 18.09.2023 10:50
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
833
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Почему предупреждение Class 'Shape' is exposed outside its defined visibility scope?

Потому что enumAreaCalculator.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 18.09.2023 11:01

@hong: есть специальная кнопка с надписью «нравится этот ответ», которая является кнопкой «за»; вам, вероятно, следует нажать ее (на самом деле это предпочтительнее, чем публиковать ее в качестве комментария). Кроме того, если это помогло решить вашу проблему, не стесняйтесь принять и этот вопрос.

Joachim Sauer 18.09.2023 11:05

«... Я создал функцию «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

Другие вопросы по теме