2016-02-12 2 views
0

Я пытаюсь создать программу, используя конструктор, который имеет три двери и переключает их из открытого и закрытого. Фронт открыт, Сторона закрыта, Назад закрыта. Затем я пытаюсь переключиться на Фронт закрыт, Сторона открыта, а Назад открыта. Моя программа работает правильно, но я считаю, что я не использовал конструктор правильно. Также для моего класса тестера есть лучший способ переключить состояние двери? Спасибо! двери классаopenClose Дверная программа с использованием конструктора

public class Door { 

String name, state; // state is either "open" or "closed" 


/** 
* Constructor class that receives two arguments. 
* 
* @param name 
* @param state 
*/ 
public Door(String name, String state) { 
    this.name = name; 
    this.state = state; 
} 

public String state() { 
    return state; 
} 

public void setState(String state) { 
    this.state = state; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public String name() { 
    return name; 
} 

// method sets door state to "open" 
public void open() { 

    state = "open"; 
} // end open 
// method sets door state to "closed" 

public void close() { 

    state = "closed"; 

} // end close 

public String output() { 
    return "Door name: " + name 
      + '\n' + "State of door: " + state; 
} 
} // end class Door 

DoorTester класс

public class Doors { 

public static void main(String[] args) { 

    Door front = new Door("Front", "open"); 
    Door side = new Door("Side", "closed"); 
    Door back = new Door("Back", "closed"); 

    System.out.println(front.output()); 
    System.out.println(side.output()); 
    System.out.println(back.output()); 

    if (front.state.equals("open")) { 
     front.close(); 

    } 
    System.out.println(front.output()); 
    if(side.state.equals("closed")){ 
     side.open(); 
    } 
    System.out.println(side.output()); 

    if(back.state.equals("closed")){ 
     back.open(); 
    } 
    System.out.println(back.output()); 
} 
} 
+2

В вашем сценарии ваши двери имеют только два состояния, так почему бы просто не использовать 'boolean' (' isOpen'?), Чтобы указать их состояние? – JonK

+0

Почему вы считаете, что не используете конструктор правильно? – Tgsmith61591

+0

На самом деле я был просто смущен с моим тестером и что я использовал состояние String вместо boolean, что заставило меня думать, что я неправильно использовал конструктор. Однако в моем исходном коде я снова посмотрел на него, и он используется правильно. @ Tgsmith61591 –

ответ

0

Имея строку, которая указывает на «открытый» или «закрыто» это немного рискованно (к примеру, вы сделали опечатку (которая может быть трудно обнаружить позже), и вы наберете в «Apen» или «clesed». Логическое немного лучшее решение просто потому, что дверь может быть закрыта или открыта ...

public class Door { 

private String name; //remember to put these as private (by default they're package-private) 
private boolean isOpen; 


/** 
* Constructor class that receives two arguments. 
* 
* @param name 
* @param state 
*/ 
public Door(String name, boolean isOpen) { 
    this.name = name; 
    this.isOpen = isOpen; 
} 

public boolean isOpen() { 
    return isOpen; 
} 

public void setState(boolean state) { 
    this.isOpen = state; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public String name() { 
    return name; 
} 

// method sets door state to "open" 
public void open() { 

    isOpen = true; 
} // end open 
// method sets door state to "closed" 

public void close() { 

    isOpen = false; 

} // end close 

public String output() { 
    return "Door name: " + name 
      + '\n' + "State of door: " + (isOpen ? "open" : "closed"); 
} 
} // end class Door 

или если вы хотите «открыто» или " закрытый "ответ fr ом класс, просто использовать простую операцию (так называемый тройной оператор):

public String state() { return isOpen ? "open" : "closed"; } 

, которая в основном так же, как:

public String state() { 
    if(isOpen) 
     return "open"; 
    else 
     return "closed; 
} 

также, как говорит Джон, имея setState и open/closed метод швов redudant ... Мое предложение было бы что-то вроде:

public changeState() { isOpen = !isOpen; } 

, поскольку вы можете только закрыть дверь, если она открыта, или наоборот ... но аль l зависит от того, что вы хотите с ним делать.

+0

Я собираюсь сделать здесь nitpick: видимость переменных-членов по умолчанию - * package-private *, ** not ** public - между ними существует большая разница. Я бы предпочел сохранить два отдельных метода 'open()' и 'close()' в этом случае: 'door.open();' гораздо более описателен для будущих сопровождающих, чем 'door.setState (true) ; ' – JonK

+0

@JonK, это правда, мое плохое. Я исправлю это. – NemanjaT

+0

Проблема с переключателями заключается в том, что вы должны проверить либо заранее, либо после того, находится ли объект в состоянии, в котором вы хотите его видеть, что является условным утверждением, за которым следует вызов переключения. С 'open()' и 'close()', текущее состояние двери игнорируется - после вызова вы можете гарантировать, что дверь находится в правильном состоянии, без дополнительной проверки. – JonK

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