Ich habe einigen hässlichen Code und will es Refactoring:Umgang mit Java Ausnahmen in Konstrukteuren gefangen, mit Endglieder
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;
}
...
Das Problem verursacht die Hässlichkeit die Interaktion zwischen final
Mitgliedern und Ausnahmen gefangen. Ich würde gerne die Mitglieder behalten final
wenn möglich.
Ich möchte den Code wie folgt bilden, aber der Java-Compiler kann den Kontrollfluss nicht analysieren - es gibt keine Möglichkeit, dass address
ein zweites Mal zugewiesen werden konnte, da die erste versuchte Zuweisung ausgelöst haben muss die catch
Klausel.
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
Jede Beratung?
P.S. Ich habe eine Einschränkung, die die Konstruktoren nicht werfen - sonst wäre das alles einfach.
jemals in Betracht gezogen, dass anstelle der letzten Instanz Variablen verwenden Sie den nicht-final verwenden kann? Wenn Sie sicherstellen möchten, dass die Unveränderlichkeit außerhalb der Klasse liegt, geben Sie eine defensive Kopie in Getter zurück. –
Ist es eine Voraussetzung, dass 'address == null', wenn die Socket-Erstellung fehlgeschlagen ist? – dhke
Warum können Sie nicht eine andere 'tmp_address' haben und am Ende 'address = tmp_address' zuweisen? –