如何在Java的编译时检索Long.MAX_VALUE的字符串值?

6
有没有可能使用运行时调用方法来设置常量编译时间值?在《Spring实战》一书中,我找到了这段代码:
private static final String MAX_LONG_AS_STRING = Long.toString(Long.MAX_VALUE);

@RequestMapping(method = RequestMethod.GET)
public List<Spittle> spittles(
        @RequestParam(value = "max", defaultValue = MAX_LONG_AS_STRING) long max,
        @RequestParam(value = "count", defaultValue = "20") int count) {
    return spittleRepository.findSpittles(max, count);
}

问题出在MAX_LONG_AS_STRING上,因为defaultValue参数需要是一个字符串常量,但MAX_LONG_AS_STRING不是一个编译时常量。有没有可能以常量字符串值的形式获取Long类型的最大值?也许有助于我在编译时调用toString方法,或以其他方式检索此值?

私有静态最终字符串 MAX_LONG_AS_STRING = "9223372036854775807"; - bradimus
@bradimus 这将是一个解决方法。如果 Java 在未来拥有更大的 long 类型,比如 128 - 256 位系统,会怎么样呢? - mlecz
@mlecz Long.MAX_VALUE 的合同规定它返回 2 ^ 63-1 - bradimus
2个回答

5

您可以按照以下步骤实现:

(1) 首先获取最大值:long MAXVALUE = Long.MAX_VALUE;

(2) 将@RequestParam的值设置为defaultValue = MAXVALUE+""(将long转换为字符串)

完整代码:

private static final long MAXVALUE = Long.MAX_VALUE;//Get the long value first

    @RequestMapping(method = RequestMethod.GET)
    public void spittles(
            @RequestParam(value = "max", defaultValue = MAXVALUE+"") long max,
            @RequestParam(value = "count", defaultValue = "20") int count) {
       // return spittleRepository.findSpittles(max, count);
    }

2
尽管我非常讨厌在代码中使用 +"" 而不是 toStringString.valueOf,但在这种情况下可能需要这样做。 - bradimus
1
但是为什么《Spring实战》可以使用MAX_LONG_AS_STRING呢? - Kassadin
你可以先将值分配给MAX_LONG_AS_STRING,然后再使用它。这是可行的。 private static final String MAX_LONG_AS_STRING = "9223372036854775807"; - Kundan Ray
不需要为其分配变量,将 Long.MAX_VALUE + "" 赋值给 defaultValue 就足够了。 - Jamby

-3
private static final String MAX_LONG_AS_STRING = String.valueOf(Long.MAX_VALUE);

可能行得通;


1
这不起作用,因为String.valueOf也是运行时调用。 - krkonop

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接