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-программа!), поэтому любая информация, которую может предоставить кто-либо, была бы здоровой! (также я приношу извинения, если я упустил какую-либо соответствующую информацию, я пытался поделиться только тем, что связано с ошибкой)
@TimMoore спасибо, буду иметь в виду! На этот раз я связал только весь код, так как не был уверен, что, возможно, я упустил из него важную часть в своем коде, которая могла вызвать проблему.
Конструктор вызывает сам себя:
//recursive error comes from here
Tags(String tag, String value)
{
this(tag, value);
}
Если бы компилятор разрешил это, конструктор при вызове вошел бы в бесконечный цикл.
Перепишите его, чтобы просто инициализировать два поля из заданных аргументов, например:
Tags(String tag, String value)
{
this.tag = tag;
this.value = value;
}
Вау, такое легкое решение. Большое спасибо, я потратил много времени, пытаясь исправить это, просматривая свой код и код шаблонов. Я не понимаю, почему код шаблонов был полностью функциональным, хотя мне он кажется таким же рекурсивным
Код какого шаблона вы имеете в виду?
В этом примере конструктор CustomSwap(String option, String target)
вызывает this(option, target, null, null)
. Обратите внимание, что это конструктор с двумя аргументами, вызывающий конструктор с четырьмя аргументами, так что это не рекурсия. Версия конструктора с четырьмя аргументами не появляется в коде, потому что она генерируется аннотацией @RequiredArgsConstructor
Lombok.
Как новичок, я бы рекомендовал не использовать Ломбок. Это может затруднить понимание того, что происходит. Ломбок лучше подходит как ярлык для разработчиков, которые уже разбираются в Java ИМХО.
@TimMoore спасибо! Мне было интересно, почему в их коде было 4 аргумента, я не совсем понял. Я также пытался передать дополнительный нулевой аргумент в своем коде, но это не решило проблему, ха-ха. Я еще не знаком с Ломбоком, поэтому последую вашему совету и больше не буду его использовать!
@ jon-hanson есть ссылка в OP
@TravelKidKurty аннотации @Getter
, @ToString
и @EqualsAndHashCode
, которые появляются в вашем коде, взяты из Ломбока. Это инструмент, который автоматически генерирует реализации конструктора и метода для класса на основе полей, которые он объявляет. В начале лучше написать их полностью, чтобы понять, как они работают.
Пожалуйста, избегайте ссылок на код на внешних сайтах, особенно если он может измениться в любое время, например, глава ветки проекта GitHub. Также сложно понять, какую из 990 строк кода вы имеете в виду. Лучше скопировать пример в текст вопроса.