Как стать автором
Обновить

Как избавиться от System.out

image

Используете ли вы, коллеги, во время написания кода вывод промежуточного результата тем или иным образом в консоль? Ну чтобы тупо посмотреть, что там получается?

Лично я это делаю постоянно (и не вижу в этом ничего плохого). В большинстве языков это делать просто (print, printf, println) или почти просто (consol.log). Иное дело Java: (System.out.println, System.out.print, System.out.printf).

Не знаю, зачем нужна в языке программирования настолько длинная конструкция для такой простой операции, как вывод строки в консоль. Скорее всего, так исторически сложилось. По крайней мере, ни один язык программирования, возникший на базе Java (Scala, Groovy, Kotlin), не грешит таким многословием.

Удивительно другое: почему до сих пор никто не предложил внятной замены System.out? Взять хотя бы библиотеку Lombok, сделавшую так много для упрощения написания кода на Java.

Так или иначе, не желая больше терпеть System.out в своей жизни, я взялся за решение этой проблемы.

Решение оказалось на удивление простым. Создается интерфейс со статическими методами:

package ru.exxo.jutil;

import java.util.Locale;
public interface Printer {

    static <T> void print(T t) {
        System.out.print(t);
    }

    static <T> void println(T t) {
        System.out.println(t);
    }

    static void printf(String str, Object... objects) {
        System.out.printf(str, objects);
    }

    static void printf(Locale locale, String str, Object... objects) {
        System.out.printf(locale, str, objects);
    }
}

Теперь в любом файле можно сделать статический импорт методов интерфейса:

import static ru.exxo.jutil.Printer.*;

И забыть про System.out навсегда!

public class PrinterDemo {
    private static class Demo {
        public Demo(String str) {
            this.str = str;
        }

        private String str;

        @Override
        public String toString() {
            return "Demo{" +
                    "str='" + str + '\'' +
                    '}';
        }
    }
    public static void main(String[] args) {

        Demo demo = new Demo("It's a Demo");
        println("I can print!");
        println(10);
        println(true);
        println(demo);

        printf("It's %TA, %<tH:%<tM. It's %s", new Date(), "good");
        printf(Locale.forLanguageTag("RU"), "%n%,.2f", 10000.5);
    }
}

По прошествии месяца полного моего отказа от System.out.println я решил сделать еще один шаг: разместить эту маленькую библиотеку в Maven Central.

Теперь в каждый свой проект я обязательно подключаю:

Maven:


<dependency>
     <groupId>ru.exxo.jutil</groupId>
     <artifactId>printer</artifactId>
     <version>1.2</version>
 </dependency>

Gradle:


implementation 'ru.exxo.jutil:printer:1.2'

Всем удачи!
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.