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