【发布时间】:2015-03-15 09:39:28
【问题描述】:
我想在构造函数中使用类的 set 方法来检查要初始化的值,如果它们不符合我设置的约束,则抛出异常。
代码示例:
public class MyClass {
// Fields
private int number;
private String string;
// Constructor
public MyClass(int number, String string) {
setNumber(number);
setString(string);
}
// Set Methods
public void setNumber(int number) {
if (number<=0) { // Certain constrain for number
throw new IllegalArgumentException("Number must be positive");
}
this.number = number;
}
public void setString(String string) { // Certain constrain for string
if (string.equals("")) {
throw new IllegalArgumentException("string cannot be empty");
}
this.string = string;
}
public String toString() {
return String.format("Ordered %d x %s%n", number, string);
}
public static void main(String[] args) {
MyClass obj = new MyClass(8, "Souvlaki"); // Everything allright
System.out.println(obj);
try {
MyClass obj2 = new MyClass(-3, "Mousaka"); // Error in number argument
} catch (IllegalArgumentException exception) { // catch the exception
System.out.printf("Exception Caught: Number must be positive%n%n");
}
MyClass obj2 = new MyClass(4, ""); // Error in string argument
// Allow the exception to end program execution
}
}
输出:
订购了 8 x 苏夫拉基
异常捕获:数字必须是正数
线程“主”java.lang.IllegalArgumentException 中的异常:字符串 在 MyClass.setString(MyClass.java:23) 处不能为空 MyClass.(MyClass.java:10) 在 MyClass.main(MyClass.java:40)
输出正是我想要的。创建的第一个对象用适当的值初始化。调用 toString() 方法隐含地证明了这一点。 第二个和第三个对象由于初始化错误而抛出异常。 捕获第一个异常是为了让程序继续执行。第二个异常没有被捕获以便输出打印的错误消息是异常。
所以一切似乎都是正确的,但这是一种好的编程技术还是隐藏了一些错误?
【问题讨论】:
-
if (string == "")不再... stackoverflow.com/questions/513832/… -
No, It's really a bad idea。请避免这样做。
-
是和不是。如果您使用的方法假定某种状态,则可能会出现问题,这种状态在构造类之前无法保证。就个人而言,我倾向于这样做以确保继承可以工作,允许子类根据需要覆盖设置的方法,而无需诉诸讨厌的黑客来使其工作,但这就是我......
-
@RohitJain:如果所有的设置器都是最终的(或者如果类本身是最终的),那么这个问题就会消失。
-
您可能希望使用构建器
标签: java constructor mutators