Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用构造函数的openClose门程序_Java - Fatal编程技术网

Java 使用构造函数的openClose门程序

Java 使用构造函数的openClose门程序,java,Java,我正在尝试使用构造函数构建一个程序,它有三扇门,并将它们从打开切换到关闭。正面打开,侧面关闭,背面关闭。然后我试着切换到前面是关闭的,侧面是打开的,后面是打开的。我的程序运行正常,但是我觉得我没有正确使用构造函数。另外,对于我的tester类,是否有更好的方法来切换门的状态? 非常感谢。 门类 public class Door { String name, state; // state is either "open" or "closed" /** * Constructor cl

我正在尝试使用构造函数构建一个程序,它有三扇门,并将它们从打开切换到关闭。正面打开,侧面关闭,背面关闭。然后我试着切换到前面是关闭的,侧面是打开的,后面是打开的。我的程序运行正常,但是我觉得我没有正确使用构造函数。另外,对于我的tester类,是否有更好的方法来切换门的状态? 非常感谢。 门类

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),并且因为object
front
尚未声明(2)。只需像
Door front=new Door(“front”,true)一样设置它
门前=新门(“前”,假);
以后更改状态只需执行
front.setState(真);
front.setState(假);
true
false
说明门是否打开(
front.isOpen()
将返回
true
false
 public changeState() { isOpen = !isOpen; }