Java ValueRange 类
最后修改时间:2025 年 4 月 16 日
java.time.temporal.ValueRange 类表示时间字段的有效值范围。它存储最小值和最大值以及最小和最大的有效值。这在 Java Time API 中广泛用于字段验证。
ValueRange 是不可变的且线程安全的。它有助于验证时间字段的值,例如日-月或时-日。该类支持固定范围和可变范围,处理闰年和其他日历变化。
ValueRange 类概述
ValueRange 提供了检查值有效性和获取范围边界的方法。关键操作包括检查值是否在范围内以及查询最小值/最大值。该类处理包含范围检查和排除范围检查。
public final class ValueRange implements Serializable {
public static ValueRange of(long min, long max);
public static ValueRange of(long min, long maxSmallest, long maxLargest);
public static ValueRange of(long min, long maxSmallest, long smallestMax, long largestMax);
public boolean isValidValue(long value);
public boolean isValidIntValue(long value);
public long getMinimum();
public long getMaximum();
public long getLargestMinimum();
public long getSmallestMaximum();
public long checkValidValue(long value, TemporalField field);
public int checkValidIntValue(long value, TemporalField field);
}
上面的代码显示了 ValueRange 提供的关键方法。这些方法允许创建范围并根据它们验证值。该类支持不同时间场景的固定范围和可变范围。
创建 ValueRange 对象
可以使用静态工厂方法创建 ValueRange 对象。最简单的形式仅采用最小值和最大值。更复杂的形式允许为诸如日-月之类的字段指定可变范围。
package com.zetcode;
import java.time.temporal.ValueRange;
public class Main {
public static void main(String[] args) {
// Fixed range (1-12 for months)
ValueRange months = ValueRange.of(1, 12);
System.out.println("Months range: " + months);
// Variable range (1-28/29/30/31 for days)
ValueRange days = ValueRange.of(1, 28, 31);
System.out.println("Days range: " + days);
// Full variable range (seconds in minute)
ValueRange seconds = ValueRange.of(0, 59, 60);
System.out.println("Seconds range: " + seconds);
// Complex range (hours in day)
ValueRange hours = ValueRange.of(0, 23, 24);
System.out.println("Hours range: " + hours);
}
}
此示例演示了创建 ValueRange 对象的不同方式。输出显示了具有其最小值和最大值的范围。请注意如何使用最小和最大最大值来表示可变范围。
检查值的有效性
ValueRange 的主要用途是验证值是否在可接受的范围内。 isValidValue 方法检查值是否在范围内。这对于输入验证非常有用。
package com.zetcode;
import java.time.temporal.ValueRange;
public class Main {
public static void main(String[] args) {
ValueRange monthRange = ValueRange.of(1, 12);
// Check valid values
System.out.println("Is 5 valid? " + monthRange.isValidValue(5));
System.out.println("Is 12 valid? " + monthRange.isValidValue(12));
// Check invalid values
System.out.println("Is 0 valid? " + monthRange.isValidValue(0));
System.out.println("Is 13 valid? " + monthRange.isValidValue(13));
// Check edge cases
System.out.println("Is Integer.MAX_VALUE valid? " +
monthRange.isValidValue(Integer.MAX_VALUE));
}
}
此示例显示了如何针对范围验证值。该方法对于范围内的值返回 true,对于范围外的值返回 false。请注意,它可以正确处理大数字。
获取范围信息
ValueRange 提供了查询其边界的方法。这些方法包括获取最小值、最大值、最小最大值和最大最大值。这对于理解范围约束非常有用。
package com.zetcode;
import java.time.temporal.ValueRange;
public class Main {
public static void main(String[] args) {
ValueRange dayRange = ValueRange.of(1, 28, 31);
// Get range information
System.out.println("Minimum: " + dayRange.getMinimum());
System.out.println("Maximum: " + dayRange.getMaximum());
System.out.println("Smallest maximum: " + dayRange.getSmallestMaximum());
System.out.println("Largest maximum: " + dayRange.getLargestMaximum());
// Check if range is fixed
System.out.println("Is fixed range? " +
(dayRange.getMinimum() == dayRange.getLargestMinimum() &&
dayRange.getMaximum() == dayRange.getSmallestMaximum()));
}
}
此示例演示了如何查询范围边界。对于可变范围,可能会返回不同的最大值。该示例还显示了如何检查范围是否固定(所有边界相等)。
使用异常验证值
ValueRange 可以验证值,并为无效值抛出异常。如果 checkValidValue 方法有效,则返回该值,否则抛出 DateTimeException。这对于严格的验证很有用。
package com.zetcode;
import java.time.temporal.ValueRange;
import java.time.DateTimeException;
public class Main {
public static void main(String[] args) {
ValueRange hourRange = ValueRange.of(0, 23);
try {
// Validate good value
long validHour = hourRange.checkValidValue(15, null);
System.out.println("Valid hour: " + validHour);
// Validate bad value
long invalidHour = hourRange.checkValidValue(25, null);
System.out.println("This won't be printed");
} catch (DateTimeException e) {
System.out.println("Error: " + e.getMessage());
}
}
}
此示例显示了具有异常处理的严格验证。如果方法有效,则返回该值,否则为无效值抛出 DateTimeException。TemporalField 参数可用于更好的错误消息。
使用时间字段
ValueRange 通常与时间字段一起使用以验证值。许多时间字段提供其有效值范围。此示例显示了如何访问和使用这些范围。
package com.zetcode;
import java.time.Month;
import java.time.temporal.ChronoField;
import java.time.temporal.ValueRange;
public class Main {
public static void main(String[] args) {
// Get range for day-of-month
ValueRange dayRange = ChronoField.DAY_OF_MONTH.range();
System.out.println("Day of month range: " + dayRange);
// Get range for specific month
ValueRange febDayRange = ChronoField.DAY_OF_MONTH.rangeRefinedBy(
Month.FEBRUARY);
System.out.println("February days range: " + febDayRange);
// Check validity for month days
System.out.println("Is 31 valid for February? " +
febDayRange.isValidValue(31));
// Get hour range
ValueRange hourRange = ChronoField.HOUR_OF_DAY.range();
System.out.println("Hour range: " + hourRange);
}
}
此示例演示了时间字段如何提供其值范围。rangeRefinedBy 方法调整特定上下文(例如月份)的范围。这就是正确处理二月的日期范围的方式。
整数值验证
ValueRange 提供了用于整数验证的特殊方法。 isValidIntValue 和 checkValidIntValue 方法确保值适合 int。这对于需要 int 的 API 非常重要。
package com.zetcode;
import java.time.temporal.ValueRange;
import java.time.DateTimeException;
public class Main {
public static void main(String[] args) {
ValueRange smallRange = ValueRange.of(1, 100);
ValueRange largeRange = ValueRange.of(1, Integer.MAX_VALUE + 1L);
// Check int validity
System.out.println("Is 50 valid int? " + smallRange.isValidIntValue(50));
System.out.println("Is 2 billion valid int? " +
largeRange.isValidIntValue(2_000_000_000L));
try {
// Get valid int value
int validInt = smallRange.checkValidIntValue(75, null);
System.out.println("Valid int: " + validInt);
// Try invalid long to int conversion
int invalidInt = largeRange.checkValidIntValue(Integer.MAX_VALUE + 1L, null);
System.out.println("This won't be printed");
} catch (DateTimeException e) {
System.out.println("Error: " + e.getMessage());
}
}
}
此示例显示了特定于整数的验证。这些方法确保值适合 int 范围(32 位有符号整数)。这可以防止从 long 转换为 int 时出现溢出问题。
来源
在本文中,我们介绍了 Java ValueRange 类的基本方法和功能。理解这些概念对于 Java 应用程序中的正确时间字段验证至关重要。
作者
列出所有Java教程。