1

省略記号を使用するというアイデアは初めてです。" " の不適切な宣言または初期化が原因でエラーが発生したことはほぼ確実ですが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;
    }
4

5 に答える 5

7

最も簡単な方法は、配列を複製することです。

public void setAuthors(String... authors){
    this.authors = (String[]) authors.clone();
}

結局のところ、以前のデータを上書きしているので、メソッド呼び出しの前にサイズを知ることはできません。authorsSizeこの時点では変数は必要ありませんauthors。配列自体の長さを知っているためです。

(もちろん、不変のコレクションを使用できれば、わざわざ複製する必要さえありません。)

編集: コメントに記載されているように、null 参照を渡すと、このメソッドは例外をスローします。これが「処理」すべき状況であると自動的に判断するべきではありません。パラメーターが null であってはならないことを文書化することは完全に正当ですどちらの方法でも、無効性に関する動作を文書化することをお勧めします。

実際、これを行う場合、次のようにインスタンス フィールドを初期化することもできます。

private String[] authors = new String[0];

そうすれば、そのフィールドにnull以外の参照があることが常にわかるので、問題なく使用できます。使用するたびに null をチェックするよりも、これをお勧めします。

于 2012-11-16T08:19:09.073 に答える
3

authors配列を初期化したことがありません。使用する前に初期化する必要があります。

String[] authors = new String[size];

//しかし、配列の次元を指定しない方法がわからない

最善の方法は、動的配列であるため、クラスを実装する List を使用することです。つまり、サイズを指定する必要はありません。

List<String> authors = new ArrayList<String>();
于 2012-11-16T08:19:10.017 に答える
1

「privateString[]authors」の宣言は、「public void setAuthors(String ... authors)」の宣言の前にあるため、「String [] authors =newString[authorsSize]」のような形式は使用できません。これにより、作成者のサイズは常に0になります。

より良い方法は、動的初期化を使用することです。List authors = new ArrayList(); 次に、this.authors.add(authors [i])を使用してパラメーターを渡します。

于 2012-11-16T09:17:10.017 に答える
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;
    }
}
于 2012-11-16T08:22:04.603 に答える
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();
    }
}
于 2012-11-16T08:27:26.033 に答える