У меня есть уродливый код и хочу его реорганизовать:
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. У меня есть ограничение, которое конструкторы не бросают - иначе все это будет легко.