如何解决必须在第一行放置超级构造函数的限制?
How do I get around the limitation of having to place super constructor in the first line?
public NoWheelsException(Car[] carArray){
String holder = "";
for (int i=0; i<carArray.length; i++) {
if (i == carArray.length - 1) {
holder = holder + carArray[i].name;
}else{
holder = holder + carArray[i].name + ", ";
}
}
String message = holder + " has/have no wheels.";
super(message);
}
上面写的是我的代码的理想场景,最后是超级构造函数。虽然,由于 super 必须是第一个语句,但我无法弄清楚如何从数组内联中开发字符串。我不能直接使用 .toString()
,因为字符串的外观有一定的标准。除了这个琐碎的细节之外,我已经设法弄清楚了与异常有关的所有内容。任何帮助将不胜感激!
更新
有人建议我尝试 Strin.join 以便 link 它们在一起,尽管不幸的是对象引用名称与数组对象中的名称变量不同...
一种方法是创建私有静态方法,因为静态方法的存在与构造函数和实例化无关:
public NoWheelsException(Car[] carArray){
super(buildMessageFrom(carArray));
}
private static String buildMessageFrom(Car[] cars) {
StringBuilder message = new StringBuilder();
String separator = "";
for (Car car : cars) {
message.append(separator);
message.append(car.name);
separator = ", ";
}
return message.toString();
}
(在循环中构建字符串时,StringBuilder 比字符串连接更有效。'holder = holder + …' 的每次迭代都会创建一个新的 String 对象,最终需要进行垃圾回收。)
如果您熟悉 Streams,您可以在一行中完成所有操作:
public NoWheelsException(Car[] carArray){
super(Arrays.stream(carArray).map(c -> c.name).collect(Collectors.joining(", ")));
}
public NoWheelsException(Car[] carArray){
String holder = "";
for (int i=0; i<carArray.length; i++) {
if (i == carArray.length - 1) {
holder = holder + carArray[i].name;
}else{
holder = holder + carArray[i].name + ", ";
}
}
String message = holder + " has/have no wheels.";
super(message);
}
上面写的是我的代码的理想场景,最后是超级构造函数。虽然,由于 super 必须是第一个语句,但我无法弄清楚如何从数组内联中开发字符串。我不能直接使用 .toString()
,因为字符串的外观有一定的标准。除了这个琐碎的细节之外,我已经设法弄清楚了与异常有关的所有内容。任何帮助将不胜感激!
更新
有人建议我尝试 Strin.join 以便 link 它们在一起,尽管不幸的是对象引用名称与数组对象中的名称变量不同...
一种方法是创建私有静态方法,因为静态方法的存在与构造函数和实例化无关:
public NoWheelsException(Car[] carArray){
super(buildMessageFrom(carArray));
}
private static String buildMessageFrom(Car[] cars) {
StringBuilder message = new StringBuilder();
String separator = "";
for (Car car : cars) {
message.append(separator);
message.append(car.name);
separator = ", ";
}
return message.toString();
}
(在循环中构建字符串时,StringBuilder 比字符串连接更有效。'holder = holder + …' 的每次迭代都会创建一个新的 String 对象,最终需要进行垃圾回收。)
如果您熟悉 Streams,您可以在一行中完成所有操作:
public NoWheelsException(Car[] carArray){
super(Arrays.stream(carArray).map(c -> c.name).collect(Collectors.joining(", ")));
}