Классы-утилиты. Статический импорт

Часто нужно пользоваться методами, которые разработчики класса не предусмотрели. Для добавления своих методов можно унаследовать класс, но не всегда это возможно — например, класс String финальный. Поэтому для таких методов создаётся отдельный класс, например, StringUtils. Он состоит исключительно из статических методов, а создание экземпляров запрещено.

Можно было бы сказать, что для таких целей подойдёт абстрактный финальный класс, но язык запрещает такое сочетание модификаторов. Поэтому создаётся финальный класс с приватным конструктором — последнее делает создание экземпляров невозможным.

Например, зачатки класса StringUtils могут выглядеть так:

package online.javanese.basics.oop.util;

public final class StringUtils {

    // запретить создание экземпляров
    private StringUtils() {}

    // например, метод для приведения первой буквы в строке
    // к верхнему регистру
    public static String capitalizeFirstLetter(String original) {
        // если подсунули null, возвращаем null
        if (original == null)
            return null;
        
        // если строка пуста, возвращаем её
        if (original.isEmpty())
            return original;
        
        // берём первый символ
        char first = original.charAt(0);
        
        // если это не буква или буква верхнего регистра,
        // нечего делать — возвращаем исходную строку
        if (!Character.isLetter(first) || Character.isUpperCase(first)) {
            return original;
        }

        // преобразуем строку в массив символов
        char[] chars = original.toCharArray();
        // приводим первый символ к верхнему регистру
        chars[0] = Character.toUpperCase(first);
        // создаём из массива знаков новую строку
        // и возвращаем её
        return new String(chars);
    }

}

Проверяем:

package online.javanese.basics.oop.util;

public class StringUtilTest {

    public static void main(String[] args) {
        System.out.println(StringUtils.capitalizeFirstLetter("hello"));
        System.out.println(StringUtils.capitalizeFirstLetter("Hello"));
        System.out.println(StringUtils.capitalizeFirstLetter("1234"));
        System.out.println(StringUtils.capitalizeFirstLetter("йцукен"));
        System.out.println(StringUtils.capitalizeFirstLetter(""));
        System.out.println(StringUtils.capitalizeFirstLetter(null));
    }

}

Выводится:

Hello
Hello
1234
Йцукен

null

Статический импорт

Выходит слишком многословно. Можно использовать статический импорт — возможность языка, которая позволяет импортировать статические методы и поля.

package online.javanese.basics.oop.util;

import static online.javanese.basics.oop.util.StringUtils.capitalizeFirstLetter;

public class StringUtilTest {

    public static void main(String[] args) {
        System.out.println(capitalizeFirstLetter("hello"));
        System.out.println(capitalizeFirstLetter("Hello"));
        System.out.println(capitalizeFirstLetter("1234"));
        System.out.println(capitalizeFirstLetter("йцукен"));
        System.out.println(capitalizeFirstLetter(""));
        System.out.println(capitalizeFirstLetter(null));
    }
    
}
Комментарии к уроку

Сообщить об ошибке