Вызов рекурсивного конструктора в классе

    final List<Tags> tags = new ArrayList<>();

    public void startUp() {
        //load tags from Config text box
        reloadTags();
    }

    @Getter
    @ToString
    @EqualsAndHashCode
    static class Tags  
    {
        private final String tag;
        private final String value;

        //recursive error comes from here
        Tags(String tag, String value)  
        {
            this(tag, value);
        }
    }

   //detect change in Config textbox, update tags
    @Subscribe
    public void onConfigChanged(ConfigChanged configChanged) {
        if (configChanged.getGroup().equals("calculatorpro")) {
            reloadTags();
        }
    }

    //clear current Tags list & update with new tags from Config Text box
    private void reloadTags()
    {
        tags.clear();
        tags.addAll(loadTags(config.customTags()));
    }

    //load tags from Config text box
    private Collection<? extends Tags> loadTags(String textbox)
    {
        List<Tags> swaps = new ArrayList<>();
        for (String line : textbox.split("\n"))
        {
            if (line.trim().equals("")) continue;
            String[] split = line.split(" = ");
            swaps.add(new Tags(
                    split[0].toLowerCase().trim(),
                    split.length > 1 ? split[1].toLowerCase().trim() : ""
            ));
        }
        return swaps;
    }

Я получаю сообщение об ошибке: «java: вызов рекурсивного конструктора» из моего класса «Теги статического класса».

Я пытаюсь составить список имен и значений тегов, которые я получаю из текстового поля пользователя (config.customTags()). Они будут вводиться в виде строки в виде tag=value (oak=255). Когда в текстовом поле обнаруживается изменение, старый список очищается и создается новый список с новым содержимым текстового поля (выполняется в функции loadTags).

Код на самом деле взят из другого файла, созданного кем-то другим, который работает, я просто взял те его части, которые подходят для моей цели, но фактическое содержимое такое же, но с измененными именами, поэтому я не уверен, почему их работает и не является рекурсивным, но мой не работает и является рекурсивным? Вот ссылка на их код (в их коде много лишнего функционала, который я не использую в своем).

Я начинающий программист (это моя первая Java-программа!), поэтому любая информация, которую может предоставить кто-либо, была бы здоровой! (также я приношу извинения, если я упустил какую-либо соответствующую информацию, я пытался поделиться только тем, что связано с ошибкой)

Пожалуйста, избегайте ссылок на код на внешних сайтах, особенно если он может измениться в любое время, например, глава ветки проекта GitHub. Также сложно понять, какую из 990 строк кода вы имеете в виду. Лучше скопировать пример в текст вопроса.

Tim Moore 15.04.2023 00:33

@TimMoore спасибо, буду иметь в виду! На этот раз я связал только весь код, так как не был уверен, что, возможно, я упустил из него важную часть в своем коде, которая могла вызвать проблему.

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

Ответы 1

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

Конструктор вызывает сам себя:

    //recursive error comes from here
    Tags(String tag, String value)  
    {
        this(tag, value);
    }

Если бы компилятор разрешил это, конструктор при вызове вошел бы в бесконечный цикл.

Перепишите его, чтобы просто инициализировать два поля из заданных аргументов, например:

    Tags(String tag, String value)  
    {
        this.tag = tag;
        this.value = value;
    }

Вау, такое легкое решение. Большое спасибо, я потратил много времени, пытаясь исправить это, просматривая свой код и код шаблонов. Я не понимаю, почему код шаблонов был полностью функциональным, хотя мне он кажется таким же рекурсивным

TravelKidKurty 15.04.2023 00:16

Код какого шаблона вы имеете в виду?

jon hanson 15.04.2023 00:20

В этом примере конструктор CustomSwap(String option, String target) вызывает this(option, target, null, null). Обратите внимание, что это конструктор с двумя аргументами, вызывающий конструктор с четырьмя аргументами, так что это не рекурсия. Версия конструктора с четырьмя аргументами не появляется в коде, потому что она генерируется аннотацией @RequiredArgsConstructor Lombok.

Tim Moore 15.04.2023 00:39

Как новичок, я бы рекомендовал не использовать Ломбок. Это может затруднить понимание того, что происходит. Ломбок лучше подходит как ярлык для разработчиков, которые уже разбираются в Java ИМХО.

Tim Moore 15.04.2023 00:41

@TimMoore спасибо! Мне было интересно, почему в их коде было 4 аргумента, я не совсем понял. Я также пытался передать дополнительный нулевой аргумент в своем коде, но это не решило проблему, ха-ха. Я еще не знаком с Ломбоком, поэтому последую вашему совету и больше не буду его использовать!

TravelKidKurty 15.04.2023 00:57

@ jon-hanson есть ссылка в OP

TravelKidKurty 15.04.2023 00:57

@TravelKidKurty аннотации @Getter, @ToString и @EqualsAndHashCode, которые появляются в вашем коде, взяты из Ломбока. Это инструмент, который автоматически генерирует реализации конструктора и метода для класса на основе полей, которые он объявляет. В начале лучше написать их полностью, чтобы понять, как они работают.

Tim Moore 15.04.2023 01:10

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