在Android/Java中分离变量声明和匿名类实例化的语法

3
根据Android Studio的提示,不要这样做:
private BluetoothAdapter.LeScanCallback mCallback = new BluetoothAdapter.LeScanCallback() {

        @Override
        public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {

        }
    };

我可以做到这个:

private BluetoothAdapter.LeScanCallback mCallback;

{
    mCallback = new BluetoothAdapter.LeScanCallback() {

        @Override
        public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {

        }
    };
}

我认为第二种语法选项更好看,但我不明白为什么在匿名类实例化周围需要花括号。 我的理解是,花括号在本地范围内限制了封闭代码,这对我来说并没有太多意义。 我错过了什么吗?

2个回答

3

那些围绕字段初始化的括号被称为初始化块。你放在里面的所有内容都会在构造函数中执行。你可以在其中执行任何代码:

class Main {
    int a = 1;
    int b;

    {
        b = 1;
        System.out.println("Hello World!");
    }
}

我更喜欢第一种方法。初始化块会引入不必要的复杂性和混乱。例如,以下代码将会编译错误:

Object a = b.toString();
Object b = "";

虽然这段代码在运行时会失败:

Object c;
Object d;

{
    d = c.toString();
    c = "";
}

当您将常规构造函数和超类添加到混合中时,它会变得更加复杂。


这非常有用!我做了3年的安卓开发,从来不知道这个,真是可惜。 - Tim
谢谢!为什么你说初始化块会引入不必要的复杂性和混乱?只是因为人们将它们放得离声明很远吗? - WWH
@WWH 很少有人知道它,也会误解它们的作用。即使是熟悉它们的人也很难确定它们的执行顺序。没有它们,代码的推理会更容易。 - Piotr Praszmo

0
当使用匿名类时,在新的NewClass语句之后的花括号中包含类定义的代码。这在这是一次性的类,您不需要再次使用它时非常有用。如果您经常使用此类,则可能需要为其定义创建单独的类文件。
您可以将相同的操作应用于方法定义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接