P
Philipp
Hello
I have a class hierarchy where the constructor of a child class ("Ford")
can throw an exception, while the constructor of the parent class
("Car") has some side-effects.
If construction fails due to the Exception on the child class being
thrown, the side-effect of the parent constructor cannot be cleaned up.
What would be a better approach to this problem, so that if construction
fails for whatever reason, the system is left in a pristine state?
Thanks for your advice
Phil
Example SSCCE:
package exceptionInCtor;
import java.util.ArrayList;
import java.util.List;
public class Car {
private static List<String> nameList = new ArrayList<String>();
private String name;
public Car(String name){
nameList.add(name); // name is added to list as side-effect
this.name = name;
}
public void remove(){ // called when car is no longer used
nameList.remove(name);
}
public static class Ford extends Car{
public Ford(String name, int wheels){
super(name);
if(wheels > 4){
throw new IllegalArgumentException("Too many wheels");
}
}
}
public static void main(String[] args) {
Car c = null;
try{
c = new Ford("myFord", 5);
} catch (Exception e) {
// cannot call c.remove() here!
e.printStackTrace();
}
System.out.println(c); // prints null
System.out.println(nameList); // prints [myFord], should be empty
}
}
I have a class hierarchy where the constructor of a child class ("Ford")
can throw an exception, while the constructor of the parent class
("Car") has some side-effects.
If construction fails due to the Exception on the child class being
thrown, the side-effect of the parent constructor cannot be cleaned up.
What would be a better approach to this problem, so that if construction
fails for whatever reason, the system is left in a pristine state?
Thanks for your advice
Phil
Example SSCCE:
package exceptionInCtor;
import java.util.ArrayList;
import java.util.List;
public class Car {
private static List<String> nameList = new ArrayList<String>();
private String name;
public Car(String name){
nameList.add(name); // name is added to list as side-effect
this.name = name;
}
public void remove(){ // called when car is no longer used
nameList.remove(name);
}
public static class Ford extends Car{
public Ford(String name, int wheels){
super(name);
if(wheels > 4){
throw new IllegalArgumentException("Too many wheels");
}
}
}
public static void main(String[] args) {
Car c = null;
try{
c = new Ford("myFord", 5);
} catch (Exception e) {
// cannot call c.remove() here!
e.printStackTrace();
}
System.out.println(c); // prints null
System.out.println(nameList); // prints [myFord], should be empty
}
}