Определите несколько определенных форматеров даты в качестве членов перечисления в Java - PullRequest
1 голос
/ 21 октября 2019

Мне нужно отследить несколько форматов (DateTimeFormatter объектов) для повторного использования в моем приложении.

➥ Как представить эти объекты форматера с помощью перечисления Java?

1 Ответ

2 голосов
/ 21 октября 2019

tl; др

Да.

FormatDateOnly.DD_MM_YYYY.getFormatter()

Подробности

Да, вы можете легко хранить некоторые DateTimeFormatter объекты в перечислении.

Удобное средство перечисления в Java достаточно мощное и гибкое.

По сути, enum в Java - это почти обычный класс Java. Ваше перечисление может иметь переменные-члены для внутреннего хранения объектов. Ваш enum может иметь конструктор, и вы можете передавать аргументы этим конструкторам. Вы можете определить методы в вашем перечислении.

Давайте соединим эти 3 объекта вместе в этом примере класса, FormatDateOnly класс перечисления.

Мы определим 3 объекта в этом перечислении с именами DD_MM_YYYY, YYYY_MM_DD и MM_DD_YYYY,При конструировании каждого мы назначаем объект DateTimeFormatter, который будет удерживаться в этом перечислении. Поскольку java.time классы ( учебник ) неизменны и предназначены для поточно-безопасных , мы можем хранить один экземпляр для повторного использованиядаже через темы. Перечисления работают в Java так: при первой загрузке нашего класса FormatDateOnly каждый из трех наших конструкторов вызывается для создания экземпляра, назначенного каждому имени.

Мы также передаем строкуиспользовать в качестве отображаемого имени каждого перечисления. Мы видим, что это используется в методе переопределения toString.

package work.basil.example;

import java.time.format.DateTimeFormatter;

public enum FormatDateOnly
{
    DD_MM_YYYY( DateTimeFormatter.ofPattern( "dd.MM.uuuu" ) , "DD.MM.YYYY" ),
    YYYY_MM_DD( DateTimeFormatter.ofPattern( "uuuu.MM.dd" ) , "YYYY.MM.DD" ),
    MM_DD_YYYY( DateTimeFormatter.ofPattern( "MM.dd.uuuu" ) , "MM.DD.YYYY" );

    private DateTimeFormatter formatter;
    private String displayName;

    FormatDateOnly ( DateTimeFormatter formatter , String displayName )
    {
        this.formatter = formatter;
        this.displayName = displayName;
    }

    @Override
    public String toString ( )
    {
        return "LocalDateFormat{" +
                "displayName='" + this.displayName + '\'' +
                '}';
    }

    public DateTimeFormatter getFormatter ( )
    {
        return this.formatter;
    }

    public String getDisplayName ( )
    {
        return this.displayName;
    }
}

Чтобы использовать эти перечисления, мы обращаемся к нужному объекту перечисления, а затем вызываем метод getter, чтобы извлечь сохраненные DateTimeFormatter, хранящиеся в этом объекте перечисления.

LocalDate localDate = LocalDate.of( 2020 , Month.JANUARY , 23 );

String output1 = localDate.format( FormatDateOnly.DD_MM_YYYY.getFormatter() );
String output2 = localDate.format( FormatDateOnly.MM_DD_YYYY.getFormatter() );
String output3 = localDate.format( FormatDateOnly.YYYY_MM_DD.getFormatter() );
  • Первая часть FormatDateOnly.DD_MM_YYYY относится к одному из трех ранее существующих объектов (создается при загрузке класса).
  • Вторая часть, .getFormatter(), вызывает метод getter для этого конкретного объекта enum для извлечения существующего объекта DateTimeFormatter, переданного в конструктор enum.

Дамп на консоль. Работает на Java 13.

System.out.println( "localDate.toString() = " + localDate );
System.out.println( "output1 = " + output1 );
System.out.println( "output2 = " + output2 );
System.out.println( "output3 = " + output3 );

localDate.toString () = 2020-01-23

output1 = 23.01.2020

output2 = 01.23.2020

output3 = 2020.01.23


Кстати, я не обязательно рекомендую эту договоренность. Обычно лучше разрешить java.time автоматически локализовать при генерации текста, представляющего объект даты и времени. Укажите FormatStyle, как долго или сокращенно вы хотите получить результирующую строку. Укажите Locale для определения человеческого языка и культурных норм, необходимых для локализации.

Locale locale = Locale.CANADA_FRENCH ;
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate( FormatStyle.SHORT ).withLocale( locale ) ;
String output = localDate.format( formatter ) ;

20-01-23

...