BluetoothServerSocket - 为什么要使用临时变量?

时间:2014-10-24 03:50:03

标签: java android final

在以下代码中分配临时变量有什么用?如果我直接使用mmServerSocket会有什么不同。为什么我将mmServerSocket初始化为最终版?

private class AcceptThread extends Thread {
private final BluetoothServerSocket mmServerSocket;

public AcceptThread() {
    // Use a temporary object that is later assigned to mmServerSocket,
    // because mmServerSocket is final
    BluetoothServerSocket tmp = null;
    try {
        // MY_UUID is the app's UUID string, also used by the client code
        tmp = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);
    } catch (IOException e) { }
    mmServerSocket = tmp;
}

2 个答案:

答案 0 :(得分:0)

这确保mmServerSocket肯定只赋值一次,这是构造函数必须满足final实例变量的要求。看起来似乎可以避免一个临时变量,如下所示:

try {
    mmServerSocket = mBluetoothAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID);
} catch (IOException e) {
    mmServerSocket = null;
}

但是,编译器会抱怨catch块中的分配可能已经分配了mmServerSocket。我不知道为什么编译器在这种情况下无法弄清楚一旦方法调用返回就不会出现异常,但这就是它的方式。

答案 1 :(得分:0)

这只是糟糕的代码。

  • mmServerSocket变量不一定是最终的。
  • 构造函数应该只是尝试直接构造BluetoothServerSocket而不用这么大惊小怪。
  • 如果失败,它也应抛出IOException,而不是默默地失败并吃掉异常并留下一个零变量,以便以后导致NPE。