我对使用省略号的想法不熟悉。我几乎可以肯定我的错误是由于不正确地声明或初始化“String[] authors
”造成的,但我不知道如何做到这一点仍然让我的setAuthors
方法有效。
import java.util.*;
public class Book {
private String[] authors; //I'm guessing this line should end with "= new String..."
//but not sure how to w/o specifying an array dimension
private int authorsSize;
//Receives variable # of String parameters and indices them into String[] "authors"
public void setAuthors(String... authors) {
authorsSize = authors.length;
for(int i=0;i<authorsSize;i++)
this.authors[i] = authors[i];
}
// getAuthors方法:
public String getAuthors(){
String s = "";
authorsSize = authors.length;
for(int i=0;i<authorsSize;i++)
s = s+authors[i] + ", ";
printAuthors = s;
return s;
}
答案 0 :(得分:7)
最简单的方法就是克隆数组:
public void setAuthors(String... authors){
this.authors = (String[]) authors.clone();
}
毕竟,你无论如何都要覆盖以前的数据,并且在方法调用之前你无法知道大小。此时您不需要authorsSize
变量 - 您已经知道authors
数组,它知道自己的长度。
(如果你能够使用不可变集合,当然你甚至不需要打扰克隆。)
编辑:如注释中所述,如果传入空引用,此方法将引发异常。你不应该自动决定这是你应该“处理”的情况 - 记录参数不能为空是完全合法的。我建议记录无效的行为。。
的确,如果你这样做,你可能 想要像这样初始化你的实例字段:
private String[] authors = new String[0];
这样你总会知道你在该字段中会有一个非空的引用,所以你可以使用它而不受惩罚。我更喜欢这个,因为每次使用时都要检查是否为空。
答案 1 :(得分:3)
您从未初始化authors
您的数组。
你需要在使用之前初始化它。
String[] authors = new String[size];
//但不确定如何不指定数组维度
最好的方法是使用List实现类,因为它们是动态数组。即,您不需要指定大小。
List<String> authors = new ArrayList<String>();
答案 2 :(得分:1)
您必须按照以下说明更正setAuthors
方法
public void setAuthors(String... authors) {
if (authors != null && authors.length > 0) {
authorsSize = authors.length;
authors = new String[authorsSize];
for (int i = 0; i < authorsSize; i++)
this.authors[i] = authors[i];
}else{
this.authors = null;
}
}
答案 3 :(得分:1)
因为“private String [] authors”的声明在“public void setAuthors(String ... authors)”之前,所以不能使用“String [] authors = new String [authorsSize]”之类的格式。 。这将使作者的大小始终为0。
更好的方法是使用动态初始化: List authors = new ArrayList(); 然后使用this.authors.add(authors [i])传递参数。
答案 4 :(得分:0)
您也可以像这样调整代码:
import java.util.*;
public class Book{
private String[] authors;
private int authorsSize;
public void setAuthors(String... authors){
//check for null, you could also set this.authors = new String[] if you prefer.
if(authors == null){
this.authors = null;
}else{
authorsSize = authors.length;
//also add this line...
this.authors = new String[authorsSize];
for(int i=0;i<authorsSize;i++)
this.authors[i] = authors[i];
}
}
public String getAuthors(){
if(authors == null){
return ""; //could also return null here if you would prefer
}
StringBuilder s = new StringBuilder();
authorsSize = authors.length;
for(int i=0;i<authorsSize;i++){
if(i > 0)
s.append(",");
s.append(authors[i]);
}
//printAuthors = s;
return s.toString();
}
}