возвращаемое значение для методов

Я пишу программу для своего задания, но для моих методов defaultFan и toString я получаю сообщение об ошибке «неверное объявление метода; требуется тип возвращаемого значения. Однако я не уверен, как это решить. Я попытался поставить void перед двумя методы, и это сработало, но затем я получаю сообщения об ошибках, в которых говорится, что я не могу назначать переменные конечным переменным медленным, средним и быстрым. Я не уверен, правильно ли это. Как мне это исправить?

Я также с трудом использую тестовые программы. Мой профессор хочет, чтобы мы использовали тестовую программу, которая создает 2 объекта вентилятора; первым назначаем максимальную скорость, радиус 10, желтый цвет и статус. а второй назначает среднюю скорость, синий цвет радиуса 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 + ".");
  }

} }


person user2085224    schedule 15.03.2013    source источник
comment
Я думаю, что имя toString подразумевает, что оно должно возвращать строку, не так ли? (Игнорируя тот факт, что у вас есть задание вместо проверки на равенство, и что вы, среди прочего, переопределяете Object toString)   -  person Benjamin Gruenbaum    schedule 15.03.2013
comment
Для таких заданий Google — ваш лучший друг.   -  person Zach Latta    schedule 15.03.2013
comment
вам нужен конструктор для вашей тестовой программы, который принимает скорость, радиус, цвет и статус в качестве параметра. Напишите основную программу для создания ваших объектов.   -  person Drogba    schedule 15.03.2013
comment
Вы должны начать искать метод main(String[] args) и попытаться понять, как инициализировать объект для проверки вашего кода (например, Fan myFan = new Fan() и т. д.)   -  person mostruash    schedule 15.03.2013


Ответы (4)


Напишите свой метод 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;
}

Я не уверен, что вы хотите делать с медленным/средним/быстрым (кажется избыточным со скоростью). Но если вы хотите изменить его, не объявляйте его окончательным.

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);
}
person Drogba    schedule 15.03.2013
comment
Может ли конструктор тестовой программы содержать только те переменные, которые будут включены в тестовую программу? Потому что для скорости он хочет, чтобы мы установили ее на медленную, среднюю или быструю, что равно 1, 2 или 3 соответственно. - person user2085224; 15.03.2013
comment
Конечно. это зависит от того, как вы это реализуете. И у вас может быть более одного конструктора. - person Drogba; 15.03.2013
comment
Спасибо большое за вашу помощь! Это действительно помогло. У меня только два последних вопроса. Могу ли я инициализировать приватные переменные после того, как я направлю public static void main (String [] args)? потому что, когда я запустил программу, она сказала, что мне это нужно. Кроме того, как я могу предположить, что тест падает, чтобы он отображал скорость и т. Д., Когда вентилятор включен и вентилятор выключен? - person user2085224; 15.03.2013
comment
взгляните на отличный ответ Эрика Джаблоу. - person Drogba; 15.03.2013

  1. Переменные slow, medium и fast являются окончательными; вы устанавливаете каждый из них в их объявлении, и вам не нужно и нельзя их повторно инициализировать. Вам нужно удалить их из вашего конструктора:

    public fan(int speed, boolean fanOn, double radius, String color) {
        this.speed = speed;
        this.fanOn = fanOn;
        this.radius = radius;
        this.color = color;
    }
    
  2. Теперь избавьтесь от методов setSlow и getSlow и и т. д.. Держи остальных.

  3. Вы хотели бы вызвать конструктор с кодом вроде:

    fan myFan = new fan(/* medium */ 2, true, 10.0, "blue");
    // But see 4 and 5 below.
    
  4. Переменные slow, medium и 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 не должен быть таким болтливым. Обычно люди пишут эти методы, чтобы помочь им отладить свой код, а не предоставить удобный доступ пользователям. Просто сообщите значения переменных экземпляра, которые не включают SLOW, MEDIUM или FAST. Не используйте условную логику.

  7. Ваш метод toString фактически переопределяет базовый метод в Object. Java будет раздражать вас, пока вы не добавите аннотацию @Override. Ради интереса напишите свой код toString, используйте его, а затем прокомментируйте код. Посмотрите, что происходит с выводом. Вы поймете, почему вам нужно переопределить метод в Object.

    @Override
    public String toString() {
         return "Fan" + "[speed: " + speed +
                        ",on: " + fanOn +
                        ",radius: " + radius +
                        ",color: " + color + "]";
    }
    
  8. Для будущей работы рассмотрите возможность использования собственного класса Java Color вместо String. Кроме того, рассмотрите возможность написания собственного перечисления Java с именем Speed вместо использования этих трех констант.

  9. Спросите себя, что кто-то, использующий код, хотел бы, чтобы код делал, как если все пойдет правильно, так и если что-то пойдет не так или класс будет использоваться неправильно. Например, возможно, класс Fan должен подчиняться следующим правилам:

    • If I construct a Fan, and I ask it for its speed, I get the speed I put in.
    • То же самое касается того, включен ли он, его радиус и цвет.
    • Если я беру Fan и вызываю метод set для одной из его переменных экземпляра, а затем запрашиваю переменную с помощью метода get, я получаю введенное значение.
    • Если я создам Fan с отрицательным радиусом или с null для его цвета, конструктор выйдет из строя, выдав IllegalArgumentException. Ваш класс, возможно, еще не рассмотрел это.
    • Точно так же, если я вызываю myFan.setRadius(-10.0), метод set выдает такое же исключение, а myFan остается нетронутым.
    • Если я попытаюсь установить скорость Fan на что-то отличное от SLOW, MEDIUM или FAST, это тоже должно потерпеть неудачу. Помните совет о перечислениях? Это веская причина.

Существует множество фреймворков, помогающих в тестировании программного обеспечения; к сожалению, люди недостаточно делают это на практике. Но посмотрите JUnit; почти наверняка в вашей среде IDE есть способы помочь вам создавать тесты JUnit.

person Eric Jablow    schedule 15.03.2013

public void toString()

Это вызывает ошибку. Сознательно или неосознанно вы пытаетесь override использовать метод Object.toString(), и именно поэтому он показывает эту ошибку. Вам нужно либо изменить возвращаемый тип вашего метода toString() на String, либо изменить имя метода на другое, чтобы избежать конфликта с Object.toString().

Помимо основной проблемы, упомянутой выше, в вашем коде также есть несколько других ошибок, которые можно решить с помощью хорошей IDE.

person RainMaker    schedule 15.03.2013

И последний вопрос: существует множество руководств по тестированию в Java. Найдите JUnit. Вот пример руководства.

person Paul    schedule 15.03.2013