0

割り当て用のプログラムを作成していますが、defaultFanメソッドとtoStringメソッドで、「メソッド宣言が無効です。戻り型が必要です。ただし、これを解決する方法がわかりません。2つの前にvoidを付けてみました。メソッドとそれは機能しましたが、変数を最終変数に低速、中速、高速で割り当てることができないというエラーが表示されます。これが正しいかどうかわかりません。これを修正するにはどうすればよいですか。

また、テストプログラムを使用するのに苦労しています。私の教授は、2つのファンオブジェクトを作成するテストプログラムを使用することを望んでいます。最初に最大速度、半径10、黄色、およびオンのステータスを割り当てます。2つ目は、中速、半径5の色、青、オフのステータスを割り当て、toStringメソッドを呼び出してファンオブジェクトを表示します。誰かがテストプログラムがどのように機能するか、そして私がこのプログラムのためにそれを作成する方法を説明することは可能でしょうか?これが私のコードです:

public class fan {

  private final int slow = 1;
  private final int medium = 2;
  private final int fast = 3;
  private int speed;
  private boolean fanOn;
  private double radius;
  private String color;

  public void defaultFan( )
  {
  int speed = 1;
  boolean fanOn = false;
  double radius = 5;
  String color = "blue";
  }

  public fan(final int slow, final int medium, final int fast, int
speed, boolean fanOn, double radius, String color) {

  this.slow = slow;
  this.medium = medium;
  this.fast = fast;
  this.speed = speed;
  this.fanOn = fanOn;
  this.radius = radius;
  this.color = color;
  }

  public final int getSlow(){
    return slow;
  }

  public final int getMedium() {
    return medium;
  }

  public final int getFast() {
    return fast;
  }

  public int getSpeed() {
    return speed;
  }

  public boolean getfanOn() {
    return fanOn;
  }

  public double getradius() {
    return radius;
  }

  public String getcolor() {
    return color;
  }

  public void setSlow(final int slow) {
    this.slow = slow;
  }

  public void setMedium(final int medium) {
    this.medium = medium;
  }

  public void setFast(final int fast) {
    this.fast = fast;
  }

  public void setSpeed(int speed) {
    this.speed = speed;
  }

  public void setFanOn(boolean fanOn) {
    this.fanOn = fanOn;
  }

  public void setRadius(double radius) {
    this.radius = radius;
  }

  public void setColor(String color) {
    this.color = color;
  }

  public void toString() {
    if(fanOn = true ) {
  System.out.println("The speed of the fan is " + speed + ", the color
of the the fan is " + color + ", and the radius of the fan is " +
radius + ".");
}
  else {
    System.out.println("The fan is off but the color is " + color +"
and the radius is " + radius + ".");
  }

}}

4

4 に答える 4

1
  1. 変数slowmedium、およびfastは final です。宣言でそれぞれを設定しますが、それらを再初期化する必要はなく、再初期化することもできません。コンストラクターからそれらを削除する必要があります。

    public fan(int speed, boolean fanOn, double radius, String color) {
        this.speed = speed;
        this.fanOn = fanOn;
        this.radius = radius;
        this.color = color;
    }
    
  2. setSlowここで、 andgetSlowメソッドなどを取り除きます。他のものを保管してください。

  3. 次のようなコードでコンストラクターを呼び出します。

    fan myFan = new fan(/* medium */ 2, true, 10.0, "blue");
    // But see 4 and 5 below.
    
  4. 変数slowmedium、およびfastは、 の特定のインスタンスに関連付けられていませんfan。したがって、これらを次のように宣言します。

    public static final int SLOW = 1;
    public static final int MEDIUM = 2;
    public static final int FAST = 3;
    // The constructor call becomes:
    fan myFan = new fan(fan.MEDIUM, true, 10.0, "blue");
    
  5. 通常、Java のクラスは大文字の名前を持ちます。クラスを呼び出しFanます。fanのすべてのインスタンスをに置き換えますFan

  6. toStringメソッドはそれほどおしゃべりであってはなりません。通常、人々はこれらのメソッドをコードのデバッグに役立てるために作成しますが、ユーザーにわかりやすいアクセスを提供するためではありません。SLOWMEDIUM、またはを含まないインスタンス変数の値を報告するだけですFAST。条件付きロジックを使用しないでください。

  7. あなたの toString メソッドは、実際には の基本的なものをオーバーライドしますObject@Override注釈を追加するまで、Java はしつこいでしょう。楽しみのために、toStringコードを書き、それを使用してから、コードをコメントアウトしてください。出力がどうなるか見てみましょう。でメソッドをオーバーライドする必要がある理由がわかりますObject

    @Override
    public String toString() {
         return "Fan" + "[speed: " + speed +
                        ",on: " + fanOn +
                        ",radius: " + radius +
                        ",color: " + color + "]";
    }
    
  8. 今後の作業でColorは、文字列の代わりに Java 独自のクラスを使用することを検討してください。Speedまた、これら 3 つの定数を使用する代わりに、独自の名前の Java 列挙型を作成することを検討してください。

  9. すべてがうまくいった場合と、うまくいかない場合やクラスが正しく使用されていない場合の両方で、コードを使用する人がそのコードで何をしたいのかを自問してください。たとえば、おそらくFanクラスは次の規則に従う必要があります。

    • を構築しFan、その速度を尋ねると、入力した速度が得られます。
    • オンかどうか、半径、色についても同様です。
    • を取り、Fanそのインスタンス変数の 1 つで set メソッドを呼び出し、get メソッドで変数をクエリすると、入力した値が取得されます。
    • Fan負の半径またはその色でを構築するとnull、コンストラクターは失敗し、IllegalArgumentException. あなたのクラスはまだそれをカバーしていないかもしれません。
    • 同様に、 を呼び出すmyFan.setRadius(-10.0)と、set メソッドは同じ例外をスローし、myFanそのまま残ります。
    • の速度を、、またはFan以外に設定しようとすると、これも失敗するはずです。列挙型に関するアドバイスを覚えていますか? これが正当な理由です。SLOWMEDIUMFAST

ソフトウェアのテストに役立つフレームワークは数多くあります。悲しいことに、人々は実際にそれを十分に行っていません。しかし、JUnit を調べてください。IDE には、ほぼ確実に、JUnit テストの作成に役立つ方法があります。

于 2013-03-15T05:09:05.003 に答える
0

public void toString()

これがエラーの原因です。override故意または無意識のうちに、メソッドを実行しようとしObject.toString()ているため、そのエラーが表示されます。との競合を避けるために、toString()メソッドの戻り値の型を に変更するか、メソッド名を別のものに変更する必要があります。StringObject.toString()

上記の主要な問題とは別に、コードには他にもいくつかのバグがあり、優れた IDE で解決できます。

于 2013-03-15T04:27:12.100 に答える
0

最後の質問ですが、Java でのテストに関するチュートリアルはいくつもあります。JUnit を検索します。チュートリアルの例を次に示します。

于 2013-03-15T04:30:35.447 に答える
0

このように toString メソッドを記述します

public String toString() {
    String description = "";
    if (fanOn = true) {
        description += "The speed of the fan is " + speed
                + ", the color  of the the fan is " + color
                + ", and the radius of the fan is " + radius + ".";
    } else {
        description += "The fan is off but the color is " + color
                + " and the radius is " + radius + ".";
    }
    return description;
}

低速/中速/高速で何をしたいのかわかりません(速度の冗長性のようです)。ただし、それを変更したい場合は、それを final として宣言しないでください。

private int slow = 1;
private int medium = 2;
private int fast = 3;

テスト プログラムにはコンストラクタが必要です。(ちなみに、クラスにはFanという名前を付ける必要があります)

public fan(int speed, double radius, String color, boolean fanOn ) {
    this.speed = speed;
    this.radius = radius;
    this.color = color;
    this.fanOn = fanOn;     
}

テスト プログラムは次のようになります。

public static void main(String args[]) {
    fan fan1 = new fan(100, 100, "red", true);
    fan fan2 = new fan(200, 200, "green", false);
}
于 2013-03-15T04:31:00.913 に答える