2016-08-26 85 views
15

Aşağıdakilerin neden derlenmeyeceğini anlayamıyorum. IDE'nin bana verdiği hata, "RequestParam.defaultValue ek açıklama özniteliğinin değeri, sabit bir ifade olmalıdır".Java kodu, öznitelik bir sabit ifade hatası olmalıdır derleme

Projem Bahar ve Maven'i içerir ve aşağıdaki gider: hatasını düşünüyorum

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

String Uzun dönüştürülmesi geliyor, ama bunu düzeltmek için nasıl bilmiyorum. Herhangi bir yardımı takdir edeceğim, ek açıklamalara ve Spring'e yeniyim.

+0

'Sabit bir ifade olmalı' hangi bölümden anlamıyorsunuz? – EJP

+8

@EJP Belki de bir sabit gibi görünen bir şeyin neden sabit olmadığını anlamıyordur? Bu önemsiz değil. – ajb

+1

Bu harika, örneğiniz benimkiyle aynı, ben de "Spring in action" ı okudum. Böyle bir çok hata var –

cevap

27

Java kuralları bir ek açıklama vardır ve bu (örneğin, bir int gibi) ilkel türü bekleyen bir parametre veya String sahip olduğunda, değeri sabit ifade olması gerektiğini söylemek. [Bu, Spring ile hiçbir ilgisi yoktur.] Kabaca söylemek gerekirse, sabit bir ifade, derleyicinin derleme zamanında anlayabileceği değeri ifade eder. Bununla birlikte, sabit bir ifadenin ne olduğuna dair kurallar vardır. Bu kurallar JLS 15.28'dadır. Sabit ifadede yalnızca belirli işlem türleri kullanılabilir. Long.toString() gibi bir yöntem çağrısı, bunlardan biri değil. Bu nedenle, ifadesini kullanarak ifadesini sabit bir ifade, olması gerektiği gibi görünse de yapar. (Size benziyor, çünkü Long.toString'un ne yaptığını biliyorsunuz. Ancak, derleyici, hangi değerlerin "sabit" yöntemleri olduğunu derlemek için tüm yöntemlerin bir kataloğunu saklamıyor.)

Ancak, bağlantıdaki örnek, bağımsız değişkenlerden biri bir dize olmadığında ve bu nedenle toString() yönteminin örtülü olarak çağrıldığı durumlarda bile + işlecinin kullanılabileceğini gösterir. Bu, bazı şeyleri şu şekilde çalıştırabileceğinizi gösterir: Yine de, denemedim.

+0

Ohh! Yardımınız için çok teşekkür ederim, bana verdiğiniz seçenek işe yarıyor! Ve verdiğiniz bağlantı ve açıklama, sürekli ifadeler hakkında daha fazla bilgi sahibi olmanıza yardımcı oldu. Daha fazla araştırma yapana kadar derleme zamanı farkından haberdar değildim, ancak yöntem kullanımı ile ilgili bir şey olduğunu bilmiyordum. Kısa ama büyük bir açıklama için çok teşekkür ederim! –

+0

'toString()' çalışma zamanında bir yöntem çağrısıdır. "" "+ 5", derleme zamanında sabit bir dize oluşturur (yanlış olabilir) - yanılıyor olabilir – junvar

+0

(junvar) Hiçbir şey derleyicinin 'Long.toString (Long.MAX_VALUE)' için sabit bir dize oluşturmasını engeller. Birden çok Java derleyicisi vardır ve her biri bunu sabit bir dizgeye mi yoksa optimize etmeye mi karar verebilir. Ancak, Java'nın hukuki olup olmadığına dair kuralları, derleyiciden bağımsız olarak aynıdır. Yasallık kuralları, bir derleyicinin yapabileceği veya yapamayacağı isteğe bağlı optimizasyonlara bağlı değildir. – ajb