Java 使用构造函数的openClose门程序
我正在尝试使用构造函数构建一个程序,它有三扇门,并将它们从打开切换到关闭。正面打开,侧面关闭,背面关闭。然后我试着切换到前面是关闭的,侧面是打开的,后面是打开的。我的程序运行正常,但是我觉得我没有正确使用构造函数。另外,对于我的tester类,是否有更好的方法来切换门的状态? 非常感谢。 门类Java 使用构造函数的openClose门程序,java,Java,我正在尝试使用构造函数构建一个程序,它有三扇门,并将它们从打开切换到关闭。正面打开,侧面关闭,背面关闭。然后我试着切换到前面是关闭的,侧面是打开的,后面是打开的。我的程序运行正常,但是我觉得我没有正确使用构造函数。另外,对于我的tester类,是否有更好的方法来切换门的状态? 非常感谢。 门类 public class Door { String name, state; // state is either "open" or "closed" /** * Constructor cl
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
门测试器类
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());
}
}
有一个表示“打开”或“关闭”的字符串有点危险(例如,您输入了一个打字错误(以后可能很难检测),然后键入“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
或者,如果您想要类的“打开”或“关闭”响应,只需使用一个简单的操作(称为三元运算符):
这基本上与:
public String state() {
if(isOpen)
return "open";
else
return "closed;
}
正如Jon所说,使用setState
和open
/closed
方法来减少接缝……我的建议如下:
public changeState() { isOpen = !isOpen; }
因为只有打开的门才能关闭,反之亦然……但这一切都取决于你想用它做什么。在你的场景中,门只有两种状态,所以为什么不简单地使用
布尔值(isOpen
?)指示它们的状态?为什么您觉得没有正确使用构造函数?事实上,我只是与我的tester类混淆了,我使用的是字符串状态而不是布尔值,这使我认为我使用构造函数是错误的。但是,在我的原始代码中,我再次查看了它,它被正确使用。@TGSmith61591我将转到nitpick这里:成员变量的默认可见性是包私有的,而不是公共的-这两者之间有很大的区别。在这种情况下,我可能会选择保留两个独立的open()
和close()
方法:door.open();
对未来的维护人员来说比door.setState(true)更具描述性
toggles的问题是,您必须事先或事后检查对象是否处于您希望它处于的状态,这是一个条件语句,后面可能跟着toggle调用
,门的当前状态被忽略-在调用后,您可以保证门处于正确的状态,无需额外检查。@JonK同样正确,但这完全取决于调用它的代码的工作方式。如果希望程序“知道”门是关着还是开着,他还必须检查(如果是打开-关闭,如果不是,打开)…但是,我想他可以把它设置为相反的(door.setState(!door.isOpen());
)@NemanjaT对于我的测试类,我会有这个代码吗…“door front=new door(“front”,front.setState(front.isOpen());”或者我会如何设置一扇门打开,因为NetBeans在说“void”此处不允许。谢谢。@WilliamWhite您不能执行Door front=new Door(“front”,front.setState(…
),因为第二个参数是布尔值,而方法是无效的(1),并且因为objectfront
尚未声明(2)。只需像Door front=new Door(“front”,true)一样设置它
或门前=新门(“前”,假);
以后更改状态只需执行front.setState(真);
或front.setState(假);
或true
或false
说明门是否打开(front.isOpen()
将返回true
或false
)
public changeState() { isOpen = !isOpen; }