Добрый день всем. Сейчас ковыряю телеграм бот на Java. В начале для того чтобы это всё запустилось делал лапшу из if-else в одном классе. Потом потихоньку начал рефакторить свой код и дошёл до той точки что не знаю уже что и делать.
Проблема в том, что у меня не получается оперировать объектами, ну т.е. не хватает умений. Покажу код и объясню попутно как я пришёл к такой жизни.
Bot.javapublic class Bot extends TelegramLongPollingBot {
protected long chat_id;
protected static String lastMessage;
protected static ReplyKeyboardMarkup replyKeyboardMarkup = new ReplyKeyboardMarkup();
@Override
public void onUpdateReceived(Update update) {
chat_id = update.getMessage().getChatId();
SendMessage sendMessage = new SendMessage()
.setChatId(chat_id)
.setText(Menu.getMessage(update.getMessage().getText()));
}
@Override
public String getBotUsername() {
return botUsername;
}
@Override
public String getBotToken() {
return token;
}
}
Изначально проблема в строчке:
SendMessage sendMessage = new SendMessage()
.setChatId(chat_id)
.setText(Menu.getMessage(update.getMessage().getText()));
Из-за того что я так и не разобрался как там нормально передавать инфу между классами и объектами, решил делать всё через static (ведь тогда можно без объекта напрямую обращаться к методам и переменным). В итоге класс Menu (куда я планировал положить всю логику по обработке сообщения) имеет такой вид:
Menu.javapublic class Menu extends Bot implements EditKeyboardRow {
static ArrayList<KeyboardRow> keyboard = new ArrayList<>();
static KeyboardRow keyboard1Row = new KeyboardRow();
static KeyboardRow keyboard2Row = new KeyboardRow();
public static String getMessage(String msg) {
replyKeyboardMarkup.setResizeKeyboard(true);
if (msg.equals("Привет") || msg.equals("Меню") || msg.equals("Выйти в главное меню")
|| msg.equals("/start")) {
keyboard.clear();
keyboard1Row.clear();
keyboard2Row.clear();
keyboard1Row.add("Начало");
keyboard1Row.add("Настройки");
keyboard2Row.add("О боте");
keyboard.add(keyboard1Row);
keyboard.add(keyboard2Row);
replyKeyboardMarkup.setKeyboard(keyboard);
return "Выберите пункт меню";
}
/* ну и так далее... */
Потом я захотел еще улучшить свой код и попробовать основные методы прокинуть через интерфейс (объявляем что будет реализовано, а не как. А в классе потом уже переопределяем) и тут я попал в ловушку. Так как обычные интерфейсы не подходят из-за статика, а статик интерфейс нельзя переопределять. И теперь я в ступоре и не знаю как выйти правильно из ситуации. Однозначно надо рефакторить код в другую сторону, но у меня нет понимания куда именно и как это сделать. Я прям вижу что у меня не объектами идет работа, а функциональщина какая-то, но в силу своих не высоких знаний не могу сам найти правильное решение.
PS Хотел посмотреть код на github у кого-то, но в основном лапшу из if-else находил.
Поэтому прошу совета куда мне двигаться и что стоит изменить. Видел примеры на Spring, но сейчас для меня кор - это максимум.