2014-11-21 3 views
0

У меня, похоже, есть логическая ошибка в моем коде. Это связано с тем, что мой первый объект Fan (FanOne) должен отображать следующий результат: Скорость: 2, Радиус: 10,0, Цвет: желтый.Ошибка логики внутри моего кода

Вместо него показывает скорость: 1

Я думаю, что есть что-то не так с моим SetSpeed ​​() метод .. но мне кажется, что все должно работать, как задумано. Пожалуйста, посоветуйте, спасибо.

public class TestFan { 
public static void main(String[] args) { 

Fan FanOne = new Fan(); 

FanOne.fanOn(); 
FanOne.setColor("yellow"); 
FanOne.setCustomSpeed("MEDIUM"); 
FanOne.setCustomRadius(10); 

System.out.println(FanOne.toString()); 

System.out.println(); 

Fan FanTwo = new Fan(); 

FanTwo.fanOff(); 
FanTwo.setCustomRadius(5); 
FanTwo.setColor("blue"); 

System.out.println(FanTwo.toString()); 

} 
} 

public class Fan { 
// Declare constant data fields 
final int SLOW = 1; 
final int MEDIUM = 2; 
final int FAST = 3; 

private int speed; 
private boolean on; 
private double radius; 
private String color; 

// Construct a default fan 
public Fan() { 
    speed = SLOW; 
    on = false; 
    radius = 5; 
    color = new String("Blue"); 
} 

// Set fan off 
public boolean fanOff() { 
    on = false; 
    return on; 
} 

// Set fan on 
public boolean fanOn() { 
    on = true; 
    return on; 
} 

public double getRadius() { 
    return radius; 
} 

// Set custom radius 
public void setCustomRadius(double rad) { 
    radius = rad; 
} 

public int getSpeed() { 
    return speed; 
} 

// Set custom speed 
public String setCustomSpeed(String speed) { 
    if (speed.equals("SLOW")) { 
    this.speed = SLOW; 
} else if (speed.equals("MEDIUM")) { 
    this.speed = MEDIUM; 
} else if (speed.equals("FAST")) { 
    this.speed = FAST; 
} 
return speed; 
} 

public String getColor() { 
return color; 
} 

public void setColor(String colorName) { 
color = colorName; 
} 

public String toString() { 
if (on == true) { 
    return ("Speed: " + speed + ", " + "Radius: " + radius + ", " + "Color: " + color); 
} else { 
    return ("Color: " + color + ", " + "Radius: " + radius + ", Alert: " + "The fan is off!"); 
} 

} 

} 
+0

Y Введение в учебное пособие Даниэля Ляна. Я признаю, что эта проблема использовала его книгу для обучения в течение многих лет! – hfontanez

ответ

2

В вашем методе сеттеров для speed, setCustomSpeed, вы меняете локальные переменные Stringspeed, а не экземпляр переменной speed. Он остается неизменным на уровне SLOW, или 1.

Используйте this, чтобы определить, что вы имеете в виду переменную экземпляра, например.

this.speed = SLOW; 

Это int так что нет необходимости конвертировать ваш постоянный в String здесь. Вы можете соответствующим образом изменить другие утверждения присваивания, и вы также можете вернуть this.speed.

+0

Бинго !!!!!!!!!! – hfontanez

+0

Я изменил свой код, чтобы отразить парадигму, которую вы обсуждали. Единственное, что я продолжал получать сообщение об ошибке «return this.speed». Я изменил его, чтобы вернуть скорость, которая привела к правильному выходу. Я не совсем уверен, почему это сработало. Я буду def читать по переменной области и затенения, хотя;) – Chewy

+0

Тип возврата, который у вас есть, в настоящее время 'String', а' speed' - 'String', так что это сработало. Вы также можете вернуть 'this.speed' и изменить тип возврата метода на' int', и это тоже будет работать, в зависимости от того, что вы хотите вернуть, - нового сохраненного значения или исходного ввода 'String'. – rgettman

2

Ваша проблема называется затенением. Ваш код здесь:

// Set custom speed 
public int setCustomSpeed(String speed) { 
    if (speed.equals("SLOW")) { 
    speed = String.valueOf(SLOW); 
} else if (speed.equals("MEDIUM")) { 
    speed = String.valueOf(MEDIUM); 
} else if (speed.equals("FAST")) { 
    speed = String.valueOf(FAST); 
} 
return speed; 
} 

устанавливает локальную переменную скорость, равную 2, оставляя переменную скорость вентилятора класса, равное все, что было раньше (конструктор устанавливает его в 1). Из-за этого нам нужно различать переменную скорости для объекта, используя this.speed. Это указывает, какую переменную использовать.

// Set custom speed 
public String setCustomSpeed(String speed) { 
    if (speed.equals("SLOW")) { 
    this.speed = String.valueOf(SLOW); 
} else if (speed.equals("MEDIUM")) { 
    this.speed = String.valueOf(MEDIUM); 
} else if (speed.equals("FAST")) { 
    this.speed = String.valueOf(FAST); 
} 
return this.speed; 
} 

Чтобы избежать этого в будущем, вы должны рассмотреть возможность использования по-разному имен переменных, и читать и понимать переменные сферы и затенение.

+0

Если я правильно помню, имена констант были определены в задании; это не выбор OP. – hfontanez

+1

@hfontanez да, но OP не всегда будет выполнять домашние задания и в конечном итоге будет разрабатывать код самостоятельно, и в этом случае было бы хорошо знать –

+1

true, что ... В качестве предложения я бы использовал 'equalsIgnoreCase 'вместо' equals' – hfontanez

Смежные вопросы