2016-11-18 13 views
6

Можно ли установить постоянное значение времени компиляции с использованием метода вызова во время выполнения? В «Весне в действии» книге, я получил этот кусок кода:Как получить строковое значение Long.MAX_VALUE во время компиляции в java?

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 max как постоянное значение String? Возможно, есть что-то, что может помочь мне вызвать метод toString во время компиляции или получить это значение любым другим способом?

+0

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

+0

@bradimus это будет обходным путем. Что делать, если java будет иметь большие длины в будущих 128 - 256-битных системах? – 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

Но почему «Весна в действии» может быть MAX_LONG_AS_STRING? – Kassadin

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

мог сделать трюк;

+0

, это не сработает, потому что String.valueOf также является вызовом во время выполнения – krkonop