2016-11-18 29 views
6

是否有任何可能的方法使用運行時調用方法來設置常量編譯時間值? 在「春天行動」的書,我這一段代碼:如何在java中編譯時檢索Long.MAX_VALUE的字符串值?

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,因爲默認值PARAM必須是一個字符串常量,但MAX_LONG_AS_STRING不是一個常數編譯時間變量,有任何可能的方式來獲取Long最大值作爲一個常量字符串值? 也許有什麼可以幫助我在編譯期間調用toString方法,或以任何其他方式檢索此值?

+0

'private static final String MAX_LONG_AS_STRING =「9223372036854775807」;'? – bradimus

+0

@bradimus這將是解決方法。如果未來的128 - 256位系統中的java有更多的長期數據呢? – mlecz

+0

@mlecz ['Long.MAX_VALUE'](https://docs.oracle.com/javase/8/docs/api/java/lang/Long.html#MAX_VALUE)的合約指定它返回'2^63 -1'。 – bradimus

回答

5

可以實現這一點如圖中下面的步驟:

(1)獲取最大值第一long MAXVALUE = Long.MAX_VALUE;

(2)設置@RequestParam值作爲defaultValue = MAXVALUE+""(長轉換成字符串)

完整代碼:

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); 
    } 
+1

儘管我討厭'+「」'而不是'toString'或者'String.valueOf',它可能在這裏需要。 – bradimus

+0

是的,我同意你 – developer

+0

但是爲什麼「Spring in Action」可以使用MAX_LONG_AS_STRING? – Kassadin

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

可以做到這一點;

+0

這不起作用,因爲String.valueOf也是一個運行時調用 – krkonop

相關問題