2014-10-24 2 views
0

Какое использование назначения временных переменных в следующем коде? Какая разница, если я использую mmServerSocket напрямую. Почему я инициализирую mmServerSocket как final?BluetoothServerSocket - Зачем использовать временную переменную?

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; 
} 

ответ

0

Это гарантирует, что mmServerSocket определенно присваивается значение ровно один раз, требование о том, что конструктор должен удовлетворять для final переменных экземпляра. Казалось бы, как можно было бы избежать временной переменной следующим образом:

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

Однако компилятор будет жаловаться, что на уступки в catch блоке, mmServerSocket, возможно, уже были назначены. Я не знаю, почему компилятор не может понять в этом случае, что нет возможности исключения после вызова метода, но так оно и есть.

0

Это просто плохой код.

  • Переменная mmServerSocket не обязательна.
  • Конструктор должен просто попытаться построить BluetoothServerSocket непосредственно без всякой этой суеты.
  • Он должен также выбросить IOException, если он терпит неудачу, вместо того, чтобы терпеть неудачу, и есть исключение и оставляя нулевую переменную, которая будет вращаться, чтобы впоследствии вызвать NPE.
+0

Но, возможно, остальная часть кода будет отлично работать с значением «null» для 'mmServerSocket' при вызове' IOException'. –

+0

@TedHopp Или, возможно, нет. Если выбрано исключение, 'AcceptThread' даже не создается, поэтому остальная часть кода не должна быть специально закодирована и подвержена« возможно »спекуляциям. – EJP

+0

Могу сказать, что «AcceptThread» может по-прежнему быть полезным (возможно, используя функции возврата, не связанные с BlueTooth), даже если выбрано исключение. Мы просто не знаем. Если вы настаиваете на необходимости переопределения API для распространения исключения, вы исключаете возможность создания «AcceptThread», когда есть исключение. –

Смежные вопросы