Groovy 中的“final”关键字

Ank*_*h92 5 groovy

这是一个错误还是 Groovy 的人故意设计的决定?

final String x = "a"
x = "b"
Run Code Online (Sandbox Code Playgroud)

你运行它,它会工作,没问题。不应该抛出运行时异常吗?用 注释班级@CompileStatic也无济于事。我期待在@CompileStatic使用时出现编译错误。

Yu *_*aao 6

如果将其编译为Script,groovyc将忽略final关键字,但如果将其包装到类中,groovyc则会引发编译错误。

fin.groovy 内容

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

$ groovyc fin.groovy
Run Code Online (Sandbox Code Playgroud)

用 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

没有final了,如果你用内容编译它

class A{
    final String x = "a"
    def a(){
        x = "b"
    }
}
Run Code Online (Sandbox Code Playgroud)

它给

$ 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
Run Code Online (Sandbox Code Playgroud)