これはGroovyの人々のバグか意図的な設計決定ですか?Groovyの 'final'キーワード
final String x = "a"
x = "b"
これを実行すると問題はありません。代わりに実行時例外をスローする必要はありませんか? @CompileStatic
でクラスに注釈を付けることは助けになりませんでした。 @CompileStatic
を使用すると、コンパイルエラーが予想されていました。
これはGroovyの人々のバグか意図的な設計決定ですか?Groovyの 'final'キーワード
final String x = "a"
x = "b"
これを実行すると問題はありません。代わりに実行時例外をスローする必要はありませんか? @CompileStatic
でクラスに注釈を付けることは助けになりませんでした。 @CompileStatic
を使用すると、コンパイルエラーが予想されていました。
あなたは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
ありがとう!しかし、奇妙な行動。私はローカルスコープでも動作するように 'final'を期待していました。 – Ankush92
[Groovyで、最終的な平均値を何]の可能な重複に(https://stackoverflow.com/questions/1652133/what-does-final-mean-in-groovy) – Joe
あなたがかっこいいのどのバージョンを実行していますか? [GROOVY-1628](https://issues.apache.org/jira/browse/GROOVY-1628)は関連性があり、2.5.0-alpha-1で修正されました。 – Marvin
実行中2.4.13。私は2.5.0を待つと思います。 – Ankush92