Подскажите, пожалуйста, как сократить/улучшить реализацию метода checkLabels

Просьба подсказать как улучшить реализацию метода checkLabels.
Моя реализация:

public Label checkLabels(TextAnalyzer[] analyzers, String text) { 
        for (int i = 0; i < analyzers.length; i++)
            if (analyzers[i].processText(text) != Label.OK) {
                return analyzers[i].processText(text);
            }

                return Label.OK;
            }
    }

Суть задания в следующем: Необходимо фильтровать комментарии на неком портале, а именно фильтровать спам, комментарии с негативным содержанием и слишком длинные комментарии.

Спам будем фильтровать по наличию указанных ключевых слов в тексте. Негативное содержание будем определять по наличию одного из трех смайликов - :( =( :|. Слишком длинные комментарии будем определять исходя из данного числа - максимальной длины комментария. Необходимо написать метод checkLabels, который будет возвращать метку для комментария по набору анализаторов текста. checkLabels должен возвращать первую не-OK метку в порядке данного набора анализаторов, и OK, если все анализаторы вернули OK. Наследники класса KeywordAnalyzer проверяют текст на наличие каких-либо ключевых слов (в случае спама мы получаем их из конструктора, в случае негативного текста мы заранее знаем набор грустных смайликов) и в случае нахождения одного из ключевых слов возвращают Label (SPAM и NEGATIVE_TEXT соответственно), а если ничего не нашлось - возвращают OK.

Возможно такой вариант реализации метода будет лучше? (заменила "старый" стиль написания цикла for на "новый"):

    public Label checkLabels(TextAnalyzer[] analyzers, String text) {

        for (TextAnalyzer an : analyzers) {
            Label result = an.processText(text);
            if (result != Label.OK)
            return result;
        }
        return Label.OK;
        }
}

Весь код:

public interface TextAnalyzer {
     Label processText(String text);
}
public enum Label {                      
        SPAM, NEGATIVE_TEXT, TOO_LONG, OK
    }

public abstract class KeywordAnalyzer implements TextAnalyzer {
    protected abstract String[] getKeywords();

    protected abstract Label getLabel();

    public Label processText(String text) {
        String[] keywords = getKeywords();
        for (String keyword : keywords) {
            if (text.contains(keyword)) {
                return getLabel();
            }
        }
        return Label.OK;
    }
}

public class SpamAnalyzer extends KeywordAnalyzer {
    private String[] keywords;

    public SpamAnalyzer(String[] keywords) {
        this.keywords = keywords;
    }

    @Override
    protected String[] getKeywords() {
        return keywords;
    }

    @Override
    protected Label getLabel() {
        return Label.SPAM;
    }
}

public class NegativeTextAnalyzer extends KeywordAnalyzer {
    private final String[] KEYWORDS = {":(", "=(", ":|"};

    @Override
    protected String[] getKeywords() {
        return KEYWORDS;
    }

    @Override
    protected Label getLabel() {
        return Label.NEGATIVE_TEXT;
    }
}

public class TooLongTextAnalyzer implements TextAnalyzer {
    private int maxLength;

    public TooLongTextAnalyzer(int limit) {
        this.maxLength = limit;
    }

    @Override
    public Label processText(String text) {
        if (text.length() > maxLength)
            return Label.TOO_LONG;
        else
            return Label.OK;
    }

}

public class Main {

public static void main(String[] args) {

        // инициализация анализаторов для проверки в порядке данного набора анализаторов
        String[] spamKeywords = {"spam", "bad"};
        int commentMaxLength = 40;
        TextAnalyzer[] textAnalyzers1 = {
                new SpamAnalyzer(spamKeywords),
                new NegativeTextAnalyzer(),
                new TooLongTextAnalyzer(commentMaxLength)
        };
        TextAnalyzer[] textAnalyzers2 = {
                new SpamAnalyzer(spamKeywords),
                new TooLongTextAnalyzer(commentMaxLength),
                new NegativeTextAnalyzer()
};

    public Label checkLabels(TextAnalyzer[] analyzers, String text) {
        for (int i = 0; i < analyzers.length; i++)
            if (analyzers[i].processText(text) != Label.OK) {
                return analyzers[i].processText(text);
            }
        return Label.OK;
    }

Заранее большое спасибо!


Ответы (1 шт):

Автор решения: Дворников Алексей

Может быть

public Label checkLabels(final TextAnalyzer[] analyzers, final String text) {
    for (int i = 0; i < analyzers.length; i++) {
        final Label value = analyzers[i].processText(text);
        if (value != Label.OK) {
            return value;
        }
    }
    return Label.OK;
}
→ Ссылка