Чтобы Java код был более понятным и простым, используются библиотеки, методы и инструменты Java Core. Рассмотрим некоторые из них.
☕ Подтянуть свои знания по Java вы можете на нашем телеграм-канале «Библиотека Java для собеса»
Аккуратный Java код
Самый простой способ быстренько «набросать» программу – использовать классы JavaBeans, которые пишутся в соответствии с некоторыми правилами. Например:
public class DataHolder { private String data; public DataHolder() { } public void setData(String data) { this.data = data; } public String getData() { return this.data; } }
Слишком много лишних условий. Даже если IDE автоматически генерирует такой код (как при стандартном создании конструктора), исправляйте его, и вот почему. Вместо этого лучше применить стиль C-структур, который позволит хранить данные:
public class DataHolder { public final String data; public DataHolder(String data) { this.data = data; } }
Это сокращение количества строк кода наполовину. Кроме того, данный класс является неизменным, поэтому и работать с ним проще.
Если вы храните объекты Map или List, которые могут быть легко изменены, используйте ImmutableMap или ImmutableList.
Шаблон Builder
Если у вас есть сложный объект, пригодится шаблон Builder.
Вы создаете статический внутренний класс, который будет строить ваш объект. Он использует изменяемое состояние, но как только вы вызываете build, он выдает неизменяемый объект.
Представьте, что у нас есть более сложный DataHolder. Builder может выглядеть так:
public class ComplicatedDataHolder { public final String data; public final int num; public static class Builder { private String data; private int num; public Builder data(String data) { this.data = data; return this; } public Builder num(int num) { this.num = num; return this; } public ComplicatedDataHolder build() { return new ComplicatedDataHolder(data, num); } } }
Чтобы применить его:
final ComplicatedDataHolder cdh = new ComplicatedDataHolder.Builder() .data("отправить это") .num(523) .build();
Существует гораздо больше примеров. Это дает вам неизменяемые объекты и более свободный интерфейс. Вместо того, чтобы писать объекты-конструкторы, рассмотрите возможность использования одной из библиотек, помогающих задействовать билдеры.
🧩☕ Интересные задачи по Java для практики можно найти на нашем телеграм-канале «Библиотека задач по Java»
Непрерывное создание объектов
Если вы создаете много неизменяемых объектов вручную, примените обработчик аннотаций для автоматического создания их из интерфейсов. Это минимизирует код шаблона и уменьшит вероятность ошибок. Посмотрите эту презентацию для понимания проблем с обычными шаблонами в Java-кодинге.
Обработчик аннотации для создания неизменяемых объектов и билдеров.
Exception
Проверенные исключения следует использовать с осторожностью. Они заставляют добавлять много try/catch блоков и заворачивать в них исключения. Лучше использовать непроверенные исключения RuntimeException, которые свидетельствуют об ошибке со стороны разработчика и не требуют постановки try/catch. С RuntimeException код становится намного чище.
Пример использования:
public int calculateSquare(Rectange rect) { if (rect == null) { throw new NullPointerException(“Rectangle can't be null”); }
Внедрение зависимости
Это, скорее, раздел разработки ПО в целом, чем раздел Java, но одним из лучших способов написания тестируемого программного обеспечения является применение зависимостей.
В Java код это обычно внедряется с помощью фреймворка Spring. Если используете конфигурацию XML, важно не злоупотреблять Spring из-за его формата конфигурации на базе XML. В XML-файле не должно быть логических или контрольных структур: только зависимости.
Хорошие альтернативы Spring – Google и Square Dagger или Google Guice.
Избегайте Null
Избегайте использования null, если это возможно. Не возвращайте нулевые коллекции, когда коллекция должна быть пустой. Если вы собираетесь использовать null, рассмотрите аннотацию @Nullable. Например, IntelliJ IDEA включает в себя встроенную поддержку для удобного ознакомления с аннотациями.
Если вы используете Java 8, отдайте предпочтение Optional. Используйте его следующим образом:
public class FooWidget { private final String data; private final Optional<Bar> bar; public FooWidget(String data) { this(data, Optional.empty()); } public FooWidget(String data, Optional<Bar> bar) { this.data = data; this.bar = bar; } public OptionalgetBar() { return bar; } }
final Optional<FooWidget> fooWidget = maybeGetFooWidget(); final Baz baz = fooWidget.flatMap(FooWidget::getBar) .flatMap(BarWidget::getBaz) .orElse(defaultBaz);
Ясно, что данные никогда не будут нулевыми, но условие при этом может выполняться или не выполняться. Единственный недостаток Optional – это то, что стандартная библиотека находится без хорошей поддержки, поэтому в ней по-прежнему требуется использование null.
Комментарии