私はいくつかの醜いコードを持っていて、それをリファクタリングしたい:
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
に到達するには、最初に試行された割り当てがスローされたに違いないため、2 回目の割り当てを行う方法はありません。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
何かアドバイス?
PSコンストラクターがスローしないという制約があります-そうでなければ、これはすべて簡単です。