Browse Source

Eagerly initialize ZERO_NANOS constant

pull/32157/head
Juergen Hoeller 2 years ago
parent
commit
5dc26460fb
  1. 40
      spring-context/src/main/java/org/springframework/scheduling/support/BitsCronField.java
  2. 5
      spring-context/src/main/java/org/springframework/scheduling/support/CronField.java
  3. 2
      spring-context/src/main/java/org/springframework/scheduling/support/QuartzCronField.java

40
spring-context/src/main/java/org/springframework/scheduling/support/BitsCronField.java

@ -1,5 +1,5 @@ @@ -1,5 +1,5 @@
/*
* Copyright 2002-2023 the original author or authors.
* Copyright 2002-2024 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -33,12 +33,9 @@ import org.springframework.util.StringUtils; @@ -33,12 +33,9 @@ import org.springframework.util.StringUtils;
*/
final class BitsCronField extends CronField {
private static final long MASK = 0xFFFFFFFFFFFFFFFFL;
@Nullable
private static BitsCronField zeroNanos = null;
public static BitsCronField ZERO_NANOS = forZeroNanos();
private static final long MASK = 0xFFFFFFFFFFFFFFFFL;
// we store at most 60 bits, for seconds and minutes, so a 64-bit long suffices
private long bits;
@ -48,16 +45,14 @@ final class BitsCronField extends CronField { @@ -48,16 +45,14 @@ final class BitsCronField extends CronField {
super(type);
}
/**
* Return a {@code BitsCronField} enabled for 0 nanoseconds.
*/
public static BitsCronField zeroNanos() {
if (zeroNanos == null) {
BitsCronField field = new BitsCronField(Type.NANO);
field.setBit(0);
zeroNanos = field;
}
return zeroNanos;
private static BitsCronField forZeroNanos() {
BitsCronField field = new BitsCronField(Type.NANO);
field.setBit(0);
return field;
}
/**
@ -108,7 +103,6 @@ final class BitsCronField extends CronField { @@ -108,7 +103,6 @@ final class BitsCronField extends CronField {
return result;
}
private static BitsCronField parseDate(String value, BitsCronField.Type type) {
if (value.equals("?")) {
value = "*";
@ -174,6 +168,7 @@ final class BitsCronField extends CronField { @@ -174,6 +168,7 @@ final class BitsCronField extends CronField {
}
}
@Nullable
@Override
public <T extends Temporal & Comparable<? super T>> T nextOrSame(T temporal) {
@ -217,7 +212,6 @@ final class BitsCronField extends CronField { @@ -217,7 +212,6 @@ final class BitsCronField extends CronField {
else {
return -1;
}
}
private void setBits(ValueRange range) {
@ -250,20 +244,16 @@ final class BitsCronField extends CronField { @@ -250,20 +244,16 @@ final class BitsCronField extends CronField {
this.bits &= ~(1L << index);
}
@Override
public int hashCode() {
return Long.hashCode(this.bits);
public boolean equals(Object other) {
return (this == other || (other instanceof BitsCronField that &&
type() == that.type() && this.bits == that.bits));
}
@Override
public boolean equals(@Nullable Object o) {
if (this == o) {
return true;
}
if (!(o instanceof BitsCronField other)) {
return false;
}
return type() == other.type() && this.bits == other.bits;
public int hashCode() {
return Long.hashCode(this.bits);
}
@Override

5
spring-context/src/main/java/org/springframework/scheduling/support/CronField.java

@ -29,7 +29,7 @@ import org.springframework.util.StringUtils; @@ -29,7 +29,7 @@ import org.springframework.util.StringUtils;
/**
* Single field in a cron pattern. Created using the {@code parse*} methods,
* main and only entry point is {@link #nextOrSame(Temporal)}.
* the main and only entry point is {@link #nextOrSame(Temporal)}.
*
* <p>Supports a Quartz day-of-month/week field with an L/# expression. Follows
* common cron conventions in every other respect, including 0-6 for SUN-SAT
@ -60,7 +60,7 @@ abstract class CronField { @@ -60,7 +60,7 @@ abstract class CronField {
* Return a {@code CronField} enabled for 0 nanoseconds.
*/
public static CronField zeroNanos() {
return BitsCronField.zeroNanos();
return BitsCronField.ZERO_NANOS;
}
/**
@ -186,7 +186,6 @@ abstract class CronField { @@ -186,7 +186,6 @@ abstract class CronField {
MONTH(ChronoField.MONTH_OF_YEAR, ChronoUnit.YEARS, ChronoField.DAY_OF_MONTH, ChronoField.HOUR_OF_DAY, ChronoField.MINUTE_OF_HOUR, ChronoField.SECOND_OF_MINUTE, ChronoField.NANO_OF_SECOND),
DAY_OF_WEEK(ChronoField.DAY_OF_WEEK, ChronoUnit.WEEKS, ChronoField.HOUR_OF_DAY, ChronoField.MINUTE_OF_HOUR, ChronoField.SECOND_OF_MINUTE, ChronoField.NANO_OF_SECOND);
private final ChronoField field;
private final ChronoUnit higherOrder;

2
spring-context/src/main/java/org/springframework/scheduling/support/QuartzCronField.java

@ -336,6 +336,7 @@ final class QuartzCronField extends CronField { @@ -336,6 +336,7 @@ final class QuartzCronField extends CronField {
}
}
@Override
public <T extends Temporal & Comparable<? super T>> T nextOrSame(T temporal) {
T result = adjust(temporal);
@ -352,7 +353,6 @@ final class QuartzCronField extends CronField { @@ -352,7 +353,6 @@ final class QuartzCronField extends CronField {
return result;
}
@Nullable
@SuppressWarnings("unchecked")
private <T extends Temporal & Comparable<? super T>> T adjust(T temporal) {

Loading…
Cancel
Save