У меня есть уродливый код и хотят, чтобы реорганизовать его:Обработка Java исключения, пойманное в конструкторах, с конечными членами
public class UdpTransport extends AbstractLayer<byte[]> {
private final DatagramSocket socket;
private final InetAddress address;
private final int port;
/* boolean dead is provided by superclass */
public UdpTransport(String host, int port) {
this.port = port;
InetAddress tmp_address = null;
try {
tmp_address = InetAddress.getByName(host);
} catch (UnknownHostException e) {
e.printStackTrace();
dead = true;
socket = null;
address = null;
return;
}
address = tmp_address;
DatagramSocket tmp_socket = null;
try {
tmp_socket = new DatagramSocket();
} catch (SocketException e) {
e.printStackTrace();
dead = true;
socket = null;
return;
}
socket = tmp_socket;
}
...
Вопрос вызывает уродства является взаимодействием между final
членами и пойманы исключениями. Я хотел бы оставить членов final
, если это возможно.
Я хотел бы сформировать код следующим образом, но компилятор Java не может проанализировать поток управления - нет никакого способа, которым можно было бы назначить address
во второй раз, поскольку первая попытка назначения должна была быть выбрана для контроля, чтобы достигнуть статья catch
.
public UdpTransport(String host, int port) {
this.port = port;
try {
address = InetAddress.getByName(host);
} catch (UnknownHostException e) {
e.printStackTrace();
dead = true;
address = null; // can only have reached here if exception was thrown
socket = null;
return;
}
...
Error:(27, 13) error: variable address might already have been assigned
Любые советы?
P.S. У меня есть ограничение, которое конструкторы не бросают, иначе все будет легко.
Всегда считал, что вместо того, чтобы использовать конечные переменные экземпляра вы можете использовать неконечное? Если вы хотите убедиться в неизменности вне класса, верните защитную копию в getter. –
Является ли требование 'address == null', если создание сокета не удалось? – dhke
Почему у вас нет другого 'tmp_address' и назначить' address = tmp_address' в самом конце? –