Skip to content

Commit 2c7f738

Browse files
committed
8368825: Use switch expression for DateTimeFormatterBuilder pattern character lookup
Reviewed-by: rriggs, naoto, scolebourne
1 parent 56baf64 commit 2c7f738

File tree

1 file changed

+49
-42
lines changed

1 file changed

+49
-42
lines changed

src/java.base/share/classes/java/time/format/DateTimeFormatterBuilder.java

Lines changed: 49 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1937,7 +1937,7 @@ private void parsePattern(String pattern) {
19371937
padNext(pad); // pad and continue parsing
19381938
}
19391939
// main rules
1940-
TemporalField field = FIELD_MAP.get(cur);
1940+
TemporalField field = getField(cur);
19411941
if (field != null) {
19421942
parseField(cur, count, field);
19431943
} else if (cur == 'z') {
@@ -2185,48 +2185,55 @@ private void parseField(char cur, int count, TemporalField field) {
21852185
}
21862186
}
21872187

2188-
/** Map of letters to fields. */
2189-
private static final Map<Character, TemporalField> FIELD_MAP = new HashMap<>();
2190-
static {
2188+
/**
2189+
* Returns the TemporalField for the given pattern character.
2190+
*
2191+
* @param ch the pattern character
2192+
* @return the TemporalField for the given pattern character, or null if not applicable
2193+
*/
2194+
private static TemporalField getField(char ch) {
21912195
// SDF = SimpleDateFormat
2192-
FIELD_MAP.put('G', ChronoField.ERA); // SDF, LDML (different to both for 1/2 chars)
2193-
FIELD_MAP.put('y', ChronoField.YEAR_OF_ERA); // SDF, LDML
2194-
FIELD_MAP.put('u', ChronoField.YEAR); // LDML (different in SDF)
2195-
FIELD_MAP.put('Q', IsoFields.QUARTER_OF_YEAR); // LDML (removed quarter from 310)
2196-
FIELD_MAP.put('q', IsoFields.QUARTER_OF_YEAR); // LDML (stand-alone)
2197-
FIELD_MAP.put('M', ChronoField.MONTH_OF_YEAR); // SDF, LDML
2198-
FIELD_MAP.put('L', ChronoField.MONTH_OF_YEAR); // SDF, LDML (stand-alone)
2199-
FIELD_MAP.put('D', ChronoField.DAY_OF_YEAR); // SDF, LDML
2200-
FIELD_MAP.put('d', ChronoField.DAY_OF_MONTH); // SDF, LDML
2201-
FIELD_MAP.put('F', ChronoField.ALIGNED_WEEK_OF_MONTH); // SDF, LDML
2202-
FIELD_MAP.put('E', ChronoField.DAY_OF_WEEK); // SDF, LDML (different to both for 1/2 chars)
2203-
FIELD_MAP.put('c', ChronoField.DAY_OF_WEEK); // LDML (stand-alone)
2204-
FIELD_MAP.put('e', ChronoField.DAY_OF_WEEK); // LDML (needs localized week number)
2205-
FIELD_MAP.put('a', ChronoField.AMPM_OF_DAY); // SDF, LDML
2206-
FIELD_MAP.put('H', ChronoField.HOUR_OF_DAY); // SDF, LDML
2207-
FIELD_MAP.put('k', ChronoField.CLOCK_HOUR_OF_DAY); // SDF, LDML
2208-
FIELD_MAP.put('K', ChronoField.HOUR_OF_AMPM); // SDF, LDML
2209-
FIELD_MAP.put('h', ChronoField.CLOCK_HOUR_OF_AMPM); // SDF, LDML
2210-
FIELD_MAP.put('m', ChronoField.MINUTE_OF_HOUR); // SDF, LDML
2211-
FIELD_MAP.put('s', ChronoField.SECOND_OF_MINUTE); // SDF, LDML
2212-
FIELD_MAP.put('S', ChronoField.NANO_OF_SECOND); // LDML (SDF uses milli-of-second number)
2213-
FIELD_MAP.put('A', ChronoField.MILLI_OF_DAY); // LDML
2214-
FIELD_MAP.put('n', ChronoField.NANO_OF_SECOND); // 310 (proposed for LDML)
2215-
FIELD_MAP.put('N', ChronoField.NANO_OF_DAY); // 310 (proposed for LDML)
2216-
FIELD_MAP.put('g', JulianFields.MODIFIED_JULIAN_DAY);
2217-
// 310 - z - time-zone names, matches LDML and SimpleDateFormat 1 to 4
2218-
// 310 - Z - matches SimpleDateFormat and LDML
2219-
// 310 - V - time-zone id, matches LDML
2220-
// 310 - v - general timezone names, not matching exactly with LDML because LDML specify to fall back
2221-
// to 'VVVV' if general-nonlocation unavailable but here it's not falling back because of lack of data
2222-
// 310 - p - prefix for padding
2223-
// 310 - X - matches LDML, almost matches SDF for 1, exact match 2&3, extended 4&5
2224-
// 310 - x - matches LDML
2225-
// 310 - w, W, and Y are localized forms matching LDML
2226-
// LDML - B - day periods
2227-
// LDML - U - cycle year name, not supported by 310 yet
2228-
// LDML - l - deprecated
2229-
// LDML - j - not relevant
2196+
return switch (ch) {
2197+
case 'G' -> ChronoField.ERA; // SDF, LDML (different to both for 1/2 chars)
2198+
case 'y' -> ChronoField.YEAR_OF_ERA; // SDF, LDML
2199+
case 'u' -> ChronoField.YEAR; // LDML (different in SDF)
2200+
case 'Q' -> IsoFields.QUARTER_OF_YEAR; // LDML (removed quarter from 310)
2201+
case 'q' -> IsoFields.QUARTER_OF_YEAR; // LDML (stand-alone)
2202+
case 'M' -> ChronoField.MONTH_OF_YEAR; // SDF, LDML
2203+
case 'L' -> ChronoField.MONTH_OF_YEAR; // SDF, LDML (stand-alone)
2204+
case 'D' -> ChronoField.DAY_OF_YEAR; // SDF, LDML
2205+
case 'd' -> ChronoField.DAY_OF_MONTH; // SDF, LDML
2206+
case 'F' -> ChronoField.ALIGNED_WEEK_OF_MONTH; // SDF, LDML
2207+
case 'E' -> ChronoField.DAY_OF_WEEK; // SDF, LDML (different to both for 1/2 chars)
2208+
case 'c' -> ChronoField.DAY_OF_WEEK; // LDML (stand-alone)
2209+
case 'e' -> ChronoField.DAY_OF_WEEK; // LDML (needs localized week number)
2210+
case 'a' -> ChronoField.AMPM_OF_DAY; // SDF, LDML
2211+
case 'H' -> ChronoField.HOUR_OF_DAY; // SDF, LDML
2212+
case 'k' -> ChronoField.CLOCK_HOUR_OF_DAY; // SDF, LDML
2213+
case 'K' -> ChronoField.HOUR_OF_AMPM; // SDF, LDML
2214+
case 'h' -> ChronoField.CLOCK_HOUR_OF_AMPM; // SDF, LDML
2215+
case 'm' -> ChronoField.MINUTE_OF_HOUR; // SDF, LDML
2216+
case 's' -> ChronoField.SECOND_OF_MINUTE; // SDF, LDML
2217+
case 'S' -> ChronoField.NANO_OF_SECOND; // LDML (SDF uses milli-of-second number)
2218+
case 'A' -> ChronoField.MILLI_OF_DAY; // LDML
2219+
case 'n' -> ChronoField.NANO_OF_SECOND; // 310 (proposed for LDML)
2220+
case 'N' -> ChronoField.NANO_OF_DAY; // 310 (proposed for LDML)
2221+
case 'g' -> JulianFields.MODIFIED_JULIAN_DAY;
2222+
default -> null;
2223+
// 310 - z - time-zone names, matches LDML and SimpleDateFormat 1 to 4
2224+
// 310 - Z - matches SimpleDateFormat and LDML
2225+
// 310 - V - time-zone id, matches LDML
2226+
// 310 - v - general timezone names, not matching exactly with LDML because LDML specify to fall back
2227+
// to 'VVVV' if general-nonlocation unavailable but here it's not falling back because of lack of data
2228+
// 310 - p - prefix for padding
2229+
// 310 - X - matches LDML, almost matches SDF for 1, exact match 2&3, extended 4&5
2230+
// 310 - x - matches LDML
2231+
// 310 - w, W, and Y are localized forms matching LDML
2232+
// LDML - B - day periods
2233+
// LDML - U - cycle year name, not supported by 310 yet
2234+
// LDML - l - deprecated
2235+
// LDML - j - not relevant
2236+
};
22302237
}
22312238

22322239
//-----------------------------------------------------------------------

0 commit comments

Comments
 (0)