我有一些丑陋的代码,想重构它:
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
有什么建议吗?
PS我有一个约束,那就是构造函数不要抛出-否则这将很容易。
让构造函数抛出异常。离开final
未分配是确定的,如果在构造函数不正常终止,在此情况下,不返回任何对象。
代码中最丑陋的部分是在构造函数中捕获异常,然后返回现有的但无效的实例。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句