Skip to content

Commit 5a8861a

Browse files
author
Justin Lu
committed
8336847: Use pattern match switch in NumberFormat classes
Reviewed-by: liach, naoto
1 parent 9e8e359 commit 5a8861a

File tree

3 files changed

+118
-143
lines changed

3 files changed

+118
-143
lines changed

src/java.base/share/classes/java/text/CompactNumberFormat.java

+43-61
Original file line numberDiff line numberDiff line change
@@ -539,58 +539,42 @@ public CompactNumberFormat(String decimalPattern,
539539
public final StringBuffer format(Object number,
540540
StringBuffer toAppendTo,
541541
FieldPosition fieldPosition) {
542-
543-
if (number == null) {
544-
throw new IllegalArgumentException("Cannot format null as a number");
545-
}
546-
547-
if (number instanceof Long || number instanceof Integer
548-
|| number instanceof Short || number instanceof Byte
549-
|| number instanceof AtomicInteger
550-
|| number instanceof AtomicLong
551-
|| (number instanceof BigInteger
552-
&& ((BigInteger) number).bitLength() < 64)) {
553-
return format(((Number) number).longValue(), toAppendTo,
554-
fieldPosition);
555-
} else if (number instanceof BigDecimal) {
556-
return format((BigDecimal) number, StringBufFactory.of(toAppendTo), fieldPosition).asStringBuffer();
557-
} else if (number instanceof BigInteger) {
558-
return format((BigInteger) number, StringBufFactory.of(toAppendTo), fieldPosition).asStringBuffer();
559-
} else if (number instanceof Number) {
560-
return format(((Number) number).doubleValue(), toAppendTo, fieldPosition);
561-
} else {
562-
throw new IllegalArgumentException("Cannot format "
563-
+ number.getClass().getName() + " as a number");
564-
}
542+
return switch (number) {
543+
case Long l -> format(l.longValue(), toAppendTo, fieldPosition);
544+
case Integer i -> format(i.longValue(), toAppendTo, fieldPosition);
545+
case Short s -> format(s.longValue(), toAppendTo, fieldPosition);
546+
case Byte b -> format(b.longValue(), toAppendTo, fieldPosition);
547+
case AtomicInteger ai -> format(ai.longValue(), toAppendTo, fieldPosition);
548+
case AtomicLong al -> format(al.longValue(), toAppendTo, fieldPosition);
549+
case BigInteger bi when bi.bitLength() < 64 -> format(bi.longValue(), toAppendTo, fieldPosition);
550+
case BigDecimal bd -> format(bd, StringBufFactory.of(toAppendTo), fieldPosition).asStringBuffer();
551+
case BigInteger bi -> format(bi, StringBufFactory.of(toAppendTo), fieldPosition).asStringBuffer();
552+
case Number n -> format(n.doubleValue(), toAppendTo, fieldPosition);
553+
case null -> throw new IllegalArgumentException("Cannot format null as a number");
554+
default -> throw new IllegalArgumentException(
555+
String.format("Cannot format %s as a number", number.getClass().getName()));
556+
};
565557
}
566558

567559
@Override
568560
StringBuf format(Object number,
569561
StringBuf toAppendTo,
570562
FieldPosition fieldPosition) {
571-
572-
if (number == null) {
573-
throw new IllegalArgumentException("Cannot format null as a number");
574-
}
575-
576-
if (number instanceof Long || number instanceof Integer
577-
|| number instanceof Short || number instanceof Byte
578-
|| number instanceof AtomicInteger
579-
|| number instanceof AtomicLong
580-
|| (number instanceof BigInteger
581-
&& ((BigInteger) number).bitLength() < 64)) {
582-
return format(((Number) number).longValue(), toAppendTo,
583-
fieldPosition);
584-
} else if (number instanceof BigDecimal) {
585-
return format((BigDecimal) number, toAppendTo, fieldPosition);
586-
} else if (number instanceof BigInteger) {
587-
return format((BigInteger) number, toAppendTo, fieldPosition);
588-
} else if (number instanceof Number) {
589-
return format(((Number) number).doubleValue(), toAppendTo, fieldPosition);
590-
} else {
591-
throw new IllegalArgumentException("Cannot format "
592-
+ number.getClass().getName() + " as a number");
593-
}
563+
return switch (number) {
564+
case Long l -> format(l.longValue(), toAppendTo, fieldPosition);
565+
case Integer i -> format(i.longValue(), toAppendTo, fieldPosition);
566+
case Short s -> format(s.longValue(), toAppendTo, fieldPosition);
567+
case Byte b -> format(b.longValue(), toAppendTo, fieldPosition);
568+
case AtomicInteger ai -> format(ai.longValue(), toAppendTo, fieldPosition);
569+
case AtomicLong al -> format(al.longValue(), toAppendTo, fieldPosition);
570+
case BigInteger bi when bi.bitLength() < 64 -> format(bi.longValue(), toAppendTo, fieldPosition);
571+
case BigDecimal bd -> format(bd, toAppendTo, fieldPosition);
572+
case BigInteger bi -> format(bi, toAppendTo, fieldPosition);
573+
case Number n -> format(n.doubleValue(), toAppendTo, fieldPosition);
574+
case null -> throw new IllegalArgumentException("Cannot format null as a number");
575+
default -> throw new IllegalArgumentException(
576+
String.format("Cannot format %s as a number", number.getClass().getName()));
577+
};
594578
}
595579

596580
/**
@@ -1182,22 +1166,20 @@ public AttributedCharacterIterator formatToCharacterIterator(Object obj) {
11821166
CharacterIteratorFieldDelegate delegate
11831167
= new CharacterIteratorFieldDelegate();
11841168
StringBuf sb = StringBufFactory.of();
1185-
1186-
if (obj instanceof Double || obj instanceof Float) {
1187-
format(((Number) obj).doubleValue(), sb, delegate);
1188-
} else if (obj instanceof Long || obj instanceof Integer
1189-
|| obj instanceof Short || obj instanceof Byte
1190-
|| obj instanceof AtomicInteger || obj instanceof AtomicLong) {
1191-
format(((Number) obj).longValue(), sb, delegate);
1192-
} else if (obj instanceof BigDecimal) {
1193-
format((BigDecimal) obj, sb, delegate);
1194-
} else if (obj instanceof BigInteger) {
1195-
format((BigInteger) obj, sb, delegate, false);
1196-
} else if (obj == null) {
1197-
throw new NullPointerException(
1169+
switch (obj) {
1170+
case Double d -> format(d.doubleValue(), sb, delegate);
1171+
case Float f -> format(f.doubleValue(), sb, delegate);
1172+
case Long l -> format(l.longValue(), sb, delegate);
1173+
case Integer i -> format(i.longValue(), sb, delegate);
1174+
case Short s -> format(s.longValue(), sb, delegate);
1175+
case Byte b -> format(b.longValue(), sb, delegate);
1176+
case AtomicInteger ai -> format(ai.longValue(), sb, delegate);
1177+
case AtomicLong al -> format(al.longValue(), sb, delegate);
1178+
case BigDecimal bd -> format(bd, sb, delegate);
1179+
case BigInteger bi -> format(bi, sb, delegate, false);
1180+
case null -> throw new NullPointerException(
11981181
"formatToCharacterIterator must be passed non-null object");
1199-
} else {
1200-
throw new IllegalArgumentException(
1182+
default -> throw new IllegalArgumentException(
12011183
"Cannot format given Object as a Number");
12021184
}
12031185
return delegate.getIterator(sb.toString());

src/java.base/share/classes/java/text/DecimalFormat.java

+53-60
Original file line numberDiff line numberDiff line change
@@ -548,44 +548,38 @@ public DecimalFormat (String pattern, DecimalFormatSymbols symbols) {
548548
public final StringBuffer format(Object number,
549549
StringBuffer toAppendTo,
550550
FieldPosition pos) {
551-
if (number instanceof Long || number instanceof Integer ||
552-
number instanceof Short || number instanceof Byte ||
553-
number instanceof AtomicInteger ||
554-
number instanceof AtomicLong ||
555-
(number instanceof BigInteger &&
556-
((BigInteger)number).bitLength () < 64)) {
557-
return format(((Number)number).longValue(), toAppendTo, pos);
558-
} else if (number instanceof BigDecimal) {
559-
return format((BigDecimal)number, StringBufFactory.of(toAppendTo), pos).asStringBuffer();
560-
} else if (number instanceof BigInteger) {
561-
return format((BigInteger)number, StringBufFactory.of(toAppendTo), pos).asStringBuffer();
562-
} else if (number instanceof Number) {
563-
return format(((Number)number).doubleValue(), toAppendTo, pos);
564-
} else {
565-
throw new IllegalArgumentException("Cannot format given Object as a Number");
566-
}
551+
return switch (number) {
552+
case Long l -> format(l.longValue(), toAppendTo, pos);
553+
case Integer i -> format(i.longValue(), toAppendTo, pos);
554+
case Short s -> format(s.longValue(), toAppendTo, pos);
555+
case Byte b -> format(b.longValue(), toAppendTo, pos);
556+
case AtomicInteger ai -> format(ai.longValue(), toAppendTo, pos);
557+
case AtomicLong al -> format(al.longValue(), toAppendTo, pos);
558+
case BigInteger bi when bi.bitLength() < 64 -> format(bi.longValue(), toAppendTo, pos);
559+
case BigDecimal bd -> format(bd, StringBufFactory.of(toAppendTo), pos).asStringBuffer();
560+
case BigInteger bi -> format(bi, StringBufFactory.of(toAppendTo), pos).asStringBuffer();
561+
case Number n -> format(n.doubleValue(), toAppendTo, pos);
562+
case null, default -> throw new IllegalArgumentException("Cannot format given Object as a Number");
563+
};
567564
}
568565

569566
@Override
570567
final StringBuf format(Object number,
571568
StringBuf toAppendTo,
572569
FieldPosition pos) {
573-
if (number instanceof Long || number instanceof Integer ||
574-
number instanceof Short || number instanceof Byte ||
575-
number instanceof AtomicInteger ||
576-
number instanceof AtomicLong ||
577-
(number instanceof BigInteger &&
578-
((BigInteger) number).bitLength() < 64)) {
579-
return format(((Number) number).longValue(), toAppendTo, pos);
580-
} else if (number instanceof BigDecimal) {
581-
return format((BigDecimal) number, toAppendTo, pos);
582-
} else if (number instanceof BigInteger) {
583-
return format((BigInteger) number, toAppendTo, pos);
584-
} else if (number instanceof Number) {
585-
return format(((Number) number).doubleValue(), toAppendTo, pos);
586-
} else {
587-
throw new IllegalArgumentException("Cannot format given Object as a Number");
588-
}
570+
return switch (number) {
571+
case Long l -> format(l.longValue(), toAppendTo, pos);
572+
case Integer i -> format(i.longValue(), toAppendTo, pos);
573+
case Short s -> format(s.longValue(), toAppendTo, pos);
574+
case Byte b -> format(b.longValue(), toAppendTo, pos);
575+
case AtomicInteger ai -> format(ai.longValue(), toAppendTo, pos);
576+
case AtomicLong al -> format(al.longValue(), toAppendTo, pos);
577+
case BigInteger bi when bi.bitLength() < 64 -> format(bi.longValue(), toAppendTo, pos);
578+
case BigDecimal bd -> format(bd, toAppendTo, pos);
579+
case BigInteger bi -> format(bi, toAppendTo, pos);
580+
case Number n -> format(n.doubleValue(), toAppendTo, pos);
581+
case null, default -> throw new IllegalArgumentException("Cannot format given Object as a Number");
582+
};
589583
}
590584

591585
/**
@@ -1021,25 +1015,23 @@ StringBuf format(BigInteger number, StringBuf result,
10211015
@Override
10221016
public AttributedCharacterIterator formatToCharacterIterator(Object obj) {
10231017
CharacterIteratorFieldDelegate delegate =
1024-
new CharacterIteratorFieldDelegate();
1018+
new CharacterIteratorFieldDelegate();
10251019
StringBuf sb = StringBufFactory.of();
1026-
1027-
if (obj instanceof Double || obj instanceof Float) {
1028-
format(((Number)obj).doubleValue(), sb, delegate);
1029-
} else if (obj instanceof Long || obj instanceof Integer ||
1030-
obj instanceof Short || obj instanceof Byte ||
1031-
obj instanceof AtomicInteger || obj instanceof AtomicLong) {
1032-
format(((Number)obj).longValue(), sb, delegate);
1033-
} else if (obj instanceof BigDecimal) {
1034-
format((BigDecimal)obj, sb, delegate);
1035-
} else if (obj instanceof BigInteger) {
1036-
format((BigInteger)obj, sb, delegate, false);
1037-
} else if (obj == null) {
1038-
throw new NullPointerException(
1039-
"formatToCharacterIterator must be passed non-null object");
1040-
} else {
1041-
throw new IllegalArgumentException(
1042-
"Cannot format given Object as a Number");
1020+
switch (obj) {
1021+
case Double d -> format(d.doubleValue(), sb, delegate);
1022+
case Float f -> format(f.doubleValue(), sb, delegate);
1023+
case Long l -> format(l.longValue(), sb, delegate);
1024+
case Integer i -> format(i.longValue(), sb, delegate);
1025+
case Short s -> format(s.longValue(), sb, delegate);
1026+
case Byte b -> format(b.longValue(), sb, delegate);
1027+
case AtomicInteger ai -> format(ai.longValue(), sb, delegate);
1028+
case AtomicLong al -> format(al.longValue(), sb, delegate);
1029+
case BigDecimal bd -> format(bd, sb, delegate);
1030+
case BigInteger bi -> format(bi, sb, delegate, false);
1031+
case null -> throw new NullPointerException(
1032+
"formatToCharacterIterator must be passed non-null object");
1033+
default -> throw new IllegalArgumentException(
1034+
"Cannot format given Object as a Number");
10431035
}
10441036
return delegate.getIterator(sb.toString());
10451037
}
@@ -1790,22 +1782,23 @@ String fastFormat(double d) {
17901782
}
17911783

17921784
/**
1793-
* Sets the {@code DigitList} used by this {@code DecimalFormat}
1785+
* Utility method that sets the {@code DigitList} used by this {@code DecimalFormat}
17941786
* instance.
1787+
*
17951788
* @param number the number to format
17961789
* @param isNegative true, if the number is negative; false otherwise
17971790
* @param maxDigits the max digits
1791+
* @throws AssertionError if provided a Number subclass that is not supported
1792+
* by {@code DigitList}
17981793
*/
17991794
void setDigitList(Number number, boolean isNegative, int maxDigits) {
1800-
1801-
if (number instanceof Double) {
1802-
digitList.set(isNegative, (Double) number, maxDigits, true);
1803-
} else if (number instanceof BigDecimal) {
1804-
digitList.set(isNegative, (BigDecimal) number, maxDigits, true);
1805-
} else if (number instanceof Long) {
1806-
digitList.set(isNegative, (Long) number, maxDigits);
1807-
} else if (number instanceof BigInteger) {
1808-
digitList.set(isNegative, (BigInteger) number, maxDigits);
1795+
switch (number) {
1796+
case Double d -> digitList.set(isNegative, d, maxDigits, true);
1797+
case BigDecimal bd -> digitList.set(isNegative, bd, maxDigits, true);
1798+
case Long l -> digitList.set(isNegative, l, maxDigits);
1799+
case BigInteger bi -> digitList.set(isNegative, bi, maxDigits);
1800+
default -> throw new AssertionError(
1801+
String.format("DigitList does not support %s", number.getClass().getName()));
18091802
}
18101803
}
18111804

src/java.base/share/classes/java/text/NumberFormat.java

+22-22
Original file line numberDiff line numberDiff line change
@@ -302,34 +302,34 @@ protected NumberFormat() {
302302
public StringBuffer format(Object number,
303303
StringBuffer toAppendTo,
304304
FieldPosition pos) {
305-
if (number instanceof Long || number instanceof Integer ||
306-
number instanceof Short || number instanceof Byte ||
307-
number instanceof AtomicInteger || number instanceof AtomicLong ||
308-
(number instanceof BigInteger &&
309-
((BigInteger)number).bitLength() < 64)) {
310-
return format(((Number)number).longValue(), toAppendTo, pos);
311-
} else if (number instanceof Number) {
312-
return format(((Number)number).doubleValue(), toAppendTo, pos);
313-
} else {
314-
throw new IllegalArgumentException("Cannot format given Object as a Number");
315-
}
305+
return switch (number) {
306+
case Long l -> format(l.longValue(), toAppendTo, pos);
307+
case Integer i -> format(i.longValue(), toAppendTo, pos);
308+
case Short s -> format(s.longValue(), toAppendTo, pos);
309+
case Byte b -> format(b.longValue(), toAppendTo, pos);
310+
case AtomicInteger ai -> format(ai.longValue(), toAppendTo, pos);
311+
case AtomicLong al -> format(al.longValue(), toAppendTo, pos);
312+
case BigInteger bi when bi.bitLength() < 64 -> format(bi.longValue(), toAppendTo, pos);
313+
case Number n -> format(n.doubleValue(), toAppendTo, pos);
314+
case null, default -> throw new IllegalArgumentException("Cannot format given Object as a Number");
315+
};
316316
}
317317

318318
@Override
319319
StringBuf format(Object number,
320320
StringBuf toAppendTo,
321321
FieldPosition pos) {
322-
if (number instanceof Long || number instanceof Integer ||
323-
number instanceof Short || number instanceof Byte ||
324-
number instanceof AtomicInteger || number instanceof AtomicLong ||
325-
(number instanceof BigInteger &&
326-
((BigInteger) number).bitLength() < 64)) {
327-
return format(((Number) number).longValue(), toAppendTo, pos);
328-
} else if (number instanceof Number) {
329-
return format(((Number) number).doubleValue(), toAppendTo, pos);
330-
} else {
331-
throw new IllegalArgumentException("Cannot format given Object as a Number");
332-
}
322+
return switch (number) {
323+
case Long l -> format(l.longValue(), toAppendTo, pos);
324+
case Integer i -> format(i.longValue(), toAppendTo, pos);
325+
case Short s -> format(s.longValue(), toAppendTo, pos);
326+
case Byte b -> format(b.longValue(), toAppendTo, pos);
327+
case AtomicInteger ai -> format(ai.longValue(), toAppendTo, pos);
328+
case AtomicLong al -> format(al.longValue(), toAppendTo, pos);
329+
case BigInteger bi when bi.bitLength() < 64 -> format(bi.longValue(), toAppendTo, pos);
330+
case Number n -> format(n.doubleValue(), toAppendTo, pos);
331+
case null, default -> throw new IllegalArgumentException("Cannot format given Object as a Number");
332+
};
333333
}
334334

335335
/**

0 commit comments

Comments
 (0)