2017-12-21 5 views
0

これはGroovyの人々のバグか意図的な設計決定ですか?Groovyの 'final'キーワード

final String x = "a" 
x = "b" 

これを実行すると問題はありません。代わりに実行時例外をスローする必要はありませんか? @CompileStaticでクラスに注釈を付けることは助けになりませんでした。 @CompileStaticを使用すると、コンパイルエラーが予想されていました。

+0

[Groovyで、最終的な平均値を何]の可能な重複に(https://stackoverflow.com/questions/1652133/what-does-final-mean-in-groovy) – Joe

+0

あなたがかっこいいのどのバージョンを実行していますか? [GROOVY-1628](https://issues.apache.org/jira/browse/GROOVY-1628)は関連性があり、2.5.0-alpha-1で修正されました。 – Marvin

+0

実行中2.4.13。私は2.5.0を待つと思います。 – Ankush92

答えて

2

あなたはScriptとしてそれをコンパイルすると、groovycはちょうどfinalキーワードを無視しますが、クラスにそれをラップしている場合、groovycは、コンパイルエラーが発生します。その逆コンパイル

コンテンツとfin.groovy

final String x = "a" 
x = "b" 

$ groovyc fin.groovy 

ByteCodeViewer

import org.codehaus.groovy.reflection.*; 
import java.lang.ref.*; 
import groovy.lang.*; 
import org.codehaus.groovy.runtime.*; 
import org.codehaus.groovy.runtime.callsite.*; 

public class fin extends Script 
{ 
    private static /* synthetic */ SoftReference $callSiteArray; 

    public fin() { 
     $getCallSiteArray(); 
    } 

    public fin(final Binding context) { 
     $getCallSiteArray(); 
     super(context); 
    } 

    public static void main(final String... args) { 
     $getCallSiteArray()[0].call((Object)InvokerHelper.class, (Object)fin.class, (Object)args); 
    } 

    public Object run() { 
     $getCallSiteArray(); 
     String x = "a"; 
     return x = "b"; 
    } 

    private static /* synthetic */ CallSiteArray $createCallSiteArray() { 
     final String[] array = { null }; 
     $createCallSiteArray_1(array); 
     return new CallSiteArray((Class)fin.class, array); 
    } 

    private static /* synthetic */ CallSite[] $getCallSiteArray() { 
     CallSiteArray $createCallSiteArray; 
     if (fin.$callSiteArray == null || ($createCallSiteArray = fin.$callSiteArray.get()) == null) { 
      $createCallSiteArray = $createCallSiteArray(); 
      fin.$callSiteArray = new SoftReference($createCallSiteArray); 
     } 
     return $createCallSiteArray.array; 
    } 
} 

とそこにはfinalは、もうありません 、あなたがコンテンツ

class A{ 
    final String x = "a" 
    def a(){ 
     x = "b" 
    } 
} 

でコンパイルした場合には提供します

$ groovyc fin.groovy 
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed: 
fin.groovy: 4: cannot modify final field 'x' outside of constructor. 
@ line 4, column 3. 
    x = "b" 
^

1 error 
+0

ありがとう!しかし、奇妙な行動。私はローカルスコープでも動作するように 'final'を期待していました。 – Ankush92