2016-09-05 1 views
1

私は、ゲーム情報と呼ばれる別のクラスの配列を作成するために使用したレビュークラスを持っています。配列のセッターメソッド

私は、レビューをgameInfoの配列に追加するためのセッターメソッドを作成しました。私はaddReviewこのゲームレビューを検索し、空のレビュースロットがある場合は、レビュー入力をレビューアレイに追加します。私はちょうど私がaddReview方法のための正しい論理を持っていることを確かめたいと思う。

class Review { 
    //review class variables 
    public String reviewText; 
    public int numberOfStars; 

    //review class constructor 
    public Review(String reviewText, int numberOfStars) { 
     this.reviewText=reviewText; 
     this.numberOfStars=numberOfStars; 
    } 
} 

class GameInfo { 
    //game info class variables 
    private String title; 
    private Review[] reviews = new Review[10]; 

    //game info class constructor 
    public GameInfo(String title, Review[] reviews) { 
     this.title=title; 
     this.reviews = reviews; 
    } 

    //setter to add single review to reviews[] 
    public void addReview(Review r) { 
     int i; 
     for(i = 0; i < this.reviews.length; i++) { 
      if(this.reviews[i] == null) { 
       this.reviews[i].reviewText = r.reviewText; 
       this.reviews[i].numberOfStars = r.numberOfStars; 
       break; 
      } 
     } 
    } 
} 
+2

T.J.の答えは、このコードが例外をもたらす理由を示しています。しかし、私はまた、これが実際にあなたが物事をどのようにしたいかどうかについても疑問を呈しますあなたのソリューションを動作させるために、 'GameInfo'を構成するコードは、' null'スロットの配列を構築しなければなりません。後で追加されます。あるいは、いくつかのレビューと他の 'ヌル'スロットを持つ配列です。これはCのやり方のようです。 'ArrayList'を見てください。これは配列に要素を動的に追加することを可能にするもっと良い方法です。 – ajb

答えて

3

は、私はちょうど私がaddReview方法の正しいロジックを持っていることを確認したいです。

いいえ、二つの問題:スローされます

if(this.reviews[i] == null) { 
    this.reviews[i].reviewText = r.reviewText; 
    this.reviews[i].numberOfStars = r.numberOfStars; 
    break; 
} 

...:あなたはそれがnull上のフィールドに代入しようと、その後nullを探していますが、持っている

  1. プロパティの値をに設定しようとしているため、NPEはnullにあります。 Reviewを作成する必要があります(または、APIの設計や変更可能かどうかに応じて、渡されたものを使用する必要があります)。

    あなたReviewはそうではない、我々は安全に渡されたインスタンスを使用可能性があり、(一度作成、変更することはできません)不変だったら:

    if(this.reviews[i] == null) { 
        this.reviews[i] = r; 
        break; 
    } 
    

    をしかし、それは可変なので(変更可能) 、我々は我々自身の(おそらく)を作成する必要があります。そこ

    if(this.reviews[i] == null) { 
        this.reviews[i] = new Review(r.reviewText, r.numberOfStars); 
        break; 
    } 
    

    、私はReviewコンストラクタに個別の引数を渡しています。私はむしろReviewにコピーコンストラクタを追加し、これを実行したい:

    if(this.reviews[i] == null) { 
        this.reviews[i] = new Review(r); 
        break; 
    } 
    
  2. addReview配列が一杯になった場合だけで静かに失敗しました。大声で失敗する:-)か、より大きい新しい配列を作成し、古い配列をコピーして最後に追加します。

    ここでは理想的な配列ではないかもしれませんが、代わりにList<Review>を使用してみることをお勧めします(ArrayList<Review>またはLinkedList<Review>で初期化できます)。はるかに簡単です。しかし、私は設計の制約を知らない。


サイドノート:あなたのReviewはpublicフィールドを持っています。通常、Javaでは、これはベストプラクティスではないと考えられています。プライベートフィールドとアクセサメソッドを代わりに使用することを検討してください。

+0

*** sigh ***「this」と表示されている場合。レビュー[私] .reviewText =新しいレビュー '上記のヒットリフレッシュ。 –

+2

"あなたのレビューは不変です"いいえ、フィールドは公開されています –

+0

@NicolasFilotto:OMG、私は完全にそれらの 'public'修飾子を見逃しました! Yikes。 –

関連する問題