Почему телегреам-бота крашит, но если убрать проблемную строку, то возникает ошибка "Cannot resolve symbol"?
Пишу простенького телеграм бота. У меня есть метод:
public String waitUserInput() {
TelegramBot bot = new TelegramBot();
String userInput = "";
int lastUpdateId = 0; // переменная для хранения идентификатора последнего обновления
while (true) {
List<Update> updates = new ArrayList<>();
try {
GetUpdates getUpdates = new GetUpdates();
getUpdates.setOffset(lastUpdateId + 1);
updates = bot.execute(getUpdates);
} catch (TelegramApiException e) {
e.printStackTrace();
}
for (Update update : updates) {
if (update.hasMessage() && update.getMessage().hasText()) {
userInput = update.getMessage().getText();
lastUpdateId = update.getUpdateId(); // обновляем значение идентификатора последнего обновления
}
}
if (!userInput.isEmpty()) {
break;
}
try {
Thread.sleep(1000); // ждем 1 секунду перед повторной проверкой наличия новых сообщений
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return userInput;
}
Когда запускаю бота при вызове данного метода, его крашит. Судя по логам и тому что я нагуглил это происходит из-за "Вызова второго экземпляра бота". Как я понимаю проблема в строке:
TelegramBot bot = new TelegramBot;
Но если убрать её возникает ошибка:
Cannot resolve symbol bot
В строке
updates = bot.execute(getUpdates);
Как я понимаю, оно не распознает инициализированного бота. Хотя он есть в классе Main:
public class Main {
public static void main(String[] args) throws TelegramApiException {
TelegramBotsApi botsApi = new TelegramBotsApi(DefaultBotSession.class);
try {
TelegramBot bot = new TelegramBot();
botsApi.registerBot(bot);
} catch (TelegramApiException e) {
e.printStackTrace();
}
}
}
Хотелось бы узнать, как можно исправить данную ошибку. Заранее спасибо!
Ответы (1 шт):
Если в программе может быть только один экземпляр бота, следует использовать синглтон, например как показано в ответе на вопрос: Как переделать класс в синглтон?:
// синглтон с ленивой инициализацией
public class TelegramBot {
private static class BotProvider {
private static final TelegramBot INSTANCE = new TelegramBot();
}
public static TelegramBot getInstance() {
return BotProvider.INSTANCE;
}
// приватный конструктор
private TelegramBot() {}
}
Соответственно, вызов конструктора new TelegramBot() следует заменить на вызов метода TelegramBot.getInstance():
- в классе
Main
public class Main {
public static void main(String[] args) throws TelegramApiException {
TelegramBotsApi botsApi = new TelegramBotsApi(DefaultBotSession.class);
try {
TelegramBot bot = TelegramBot.getInstance();
botsApi.registerBot(bot);
} catch (TelegramApiException e) {
e.printStackTrace();
}
}
}
- в методе
waitUserInput()
public String waitUserInput() {
TelegramBot bot = TelegramBot.getInstance();
// ...
}
Аналогично, при реализации синглтона с помощью идиоматического преобразования класса в перечисление enum:
public enum TelegramBot {
INSTANCE;
// остальной код бота
}
все обращения к боту выполняются как к обычному экземпляру перечисления: TelegramBot bot = TelegramBot.INSTANCE;