Рефакторинг introduce constant не является обязательным. Тоесть ты можешь просто в коде писать хардкодом строки если они используются только 1 раз. С точки зрения компиллятора все подобные строки будут константами в блоке констант класса поэтому декларация их отдельно имеет чисто эстетический характер.
По поводу лесенки из if-else. Здесь можно два рефакторинга. Во первых убрать цепочку методов.
Вот это
if (backMessage.getCaption().contains(PZV_NAME)) {
whichBook(POD_COVER, POD_NAME, POD_DESC);
} else if (backMessage.getCaption().contains(POD_NAME)) {
заменить на
val caption = backMessage.getCaption()
if (caption.contains(PZV_NAME)) {
whichBook(POD_COVER, POD_NAME, POD_DESC);
} else if (caption.contains(POD_NAME)) {
И второе. Вот эта логика может быть сведена к вызову одной функции которая на вход получает атом и на выходе возвращает тройку атомов (tuple или triple). В этом случае логика if-else сводится к конфигурации таблички замен
и к функции которая просто делает декодирование одного значения в другое.
static final Map<String,Triple<String,String,String>> = new HashMap() {{
put(PZV_NAME, ImmutableTriple.of(POD_COVER, POD_NAME, POD_DESC);
put(POD_NAME, ImmutableTriple.of(KORR_COVER, KORR_NAME, KORR_DESC);
.......
}};
Map<String,Triple<String,String,String>> transform(String arg) {
return map.entrySet()
.stream()
.filter(x -> x.getKey().contains(arg))
.findFirst().get().getValue();
}