0

2 つの作成者オブジェクト フィールドを比較するクラス メソッドを作成しています。

 public int compareTo(Author b) {

    int i = -2;
    String afn = this.firstName;
    String aln = this.lastName;
    String bfn = b.firstName;
    String bln = b.lastName;

    if(afn.equals(bfn)) { i++; }
    if(aln.equals(bln)) { i++; }
    return i;
  } 

ただし、異なる文字列で作成者オブジェクトを通過すると、それでもゼロが返されます。私のアプローチに何か問題がありますか?また、メソッドには「これ」が必要ですか?

これがクラスです。

public class Author {


    String firstName = TITLE_NOT_SET;
    String lastName = TITLE_NOT_SET;
    int birth = YEAR_NOT_SET;
    int death = YEAR_NOT_SET;


  public Author(String ln, String fn) {

    String lastName = ln; 
    String firstName = fn;
  }


  public int getDeath() {

    return death;
  }

  public int getBirth() {

    return birth;
  }

  public void setDates(int b) {

    if(b > 2018 || b < -2000) { b = birth; }
    birth = b;
  }  

  public void setDates(int b, int d) {

    if(b > 2018 || b < -2000) { b = birth; }
    if(d < b) { d = death; }
    birth = b;
    death = d;
  }

  public int compareTo(Author b) {

    int i = -2;
    String afn = this.firstName;
    String aln = this.lastName;
    String bfn = b.firstName;
    String bln = b.lastName;

    if(afn.equals(bfn)) { i++; }
    if(aln.equals(bln)) { i++; }
    return i;
  }

  public String toString() {

     return lastName + ", " + firstName;
  }

}
4

1 に答える 1

1

コードにいくつかのエラーがあります。問題の直接の原因は、コンストラクターがインスタンス変数をシャドーイングしているため、クラスの toString メソッドをテストするときにわかるように、構築時に変更されないことです。

public Author(String ln, String fn) {
    String lastName = ln; //Remove 'String'
    String firstName = fn; //Remove 'String'
}

私のスタイルに固執すると、コンストラクターは次のように記述されます。

public Author(String lastName, String firstName) {
    this.firstName = firstName; //Using the 'this' makes it clear to me exactly what I wish to happen...
    this.lastName = lastName;
}

シャドーイングは、より高いスコープの変数がブロックされている場所です。これは、より近いスコープの変数と名前を共有しているためです (実際には、通常はパラメーターですが、そこで宣言されている可能性があります)。どちらも同じ名前を共有しているため、あいまいさを軽減するために、最も近いスコープの名前が使用されます。thisキーワードを使用してインスタンス スコープにアクセスしたり、ClassName を使用して静的変数にアクセスしたりできます。覚えておくべき主なことは、変数を宣言するときに、意図的に変数をシャドウしたことをコンパイラが必ずしも通知しないことです。そのため、名前を再利用する場合は、目的のスコープ内の変数にアクセスしていることを確認してください。 . 多分ここでもっと助けて...

于 2013-11-06T01:21:32.967 に答える