【问题标题】:Proper Constructors to Run all Methods in Java在 Java 中运行所有方法的正确构造函数
【发布时间】:2018-02-13 22:29:23
【问题描述】:

我有这个类,需要知道需要哪个构造函数来创建一个可以立即使用其所有方法而不会出错的对象

public class Robot {
    private boolean fuelEmpty = true;
    private int roboID;
    private String greeting;
    private String securityProtocol;

//insert robot constructor here

public void destroyAllHumans(){
    while (fuelEmpty == false) {
        //robot begins to destroy all humans
    }
}
public int getRoboID(){
    return roboID;
}
public void greet(){
    System.out.println(greeting);
}
public void setSecurityProtocol(String proto){
    securityProtocol = proto;
}
}

例如应该是这样的:

public Robot(int id, String greet) {
    roboID = id;
    greeting = greet;
}

或者这个:

public Robot(int id, String greet) {
    roboID = id;
    greeting = greet;
    fuelEmpty = false;
}

或:

public Robot(boolean full, int id, String greet, String proto) {
    roboID = id;
    greeting = greet;
    fuelEmpty = full;
    securityProtocol = proto;
}

需要这些(或其他不同的东西)中的哪一个,以便所有其他方法可以运行而不会出错?

【问题讨论】:

  • 离题:你应该这样做 while (!fuelEmpty ) { 代替
  • 由于destroyAllHumans 方法的主体未定义,因此很难判断需要哪些类成员。 securityProtocol 是干什么用的?
  • 欢迎来到 Stack Overflow!我注意到你的问题仍然是“开放的”——因为你没有接受答案。请查看并决定是否要accept 回答。或者让我知道我是否可以做些什么来增强我的输入以使其被接受。接受有助于未来的读者确定问题是否已解决,并对花时间回答你的人表示感谢。谢谢!

标签: java class object methods constructor


【解决方案1】:

解决方案如下:

  • 你看看你的每一种方法
  • 您检查每个方法使用的字段
  • 您更仔细地检查,当该字段具有其 默认 值时方法是否中断(例如 null 用于对象,或 false 用于布尔值)

当您对所有方法执行此操作时,您会得到一个需要以某种方式初始化的字段列表。然后你可以继续定义相应的构造函数。

当然,这是错误的方法。

真正的答案是这样的:你不会把字段放到一个类中,因为你可以。添加它们是因为它们是必需的,以便此类可以实现您希望它实现的需求(职责)。意思是:你专注于你的类应该提供的方法。然后,您明确需要哪些字段来实现这些方法。

换句话说:您的班级中恰好有班级需要的那些字段。如果您有未使用的字段 - 那么您就可以摆脱它们。

【讨论】:

    【解决方案2】:

    你可以根据需要重载构造函数,重要的是 创建新对象后,该对象会正确实例化...

    一种方法可以是:

    public Robot() {
        this(false, 0, "", "");
    }
    
    public Robot(int id) {
        this(false, id, "", "");
    }
    
    public Robot(boolean fuelEmpty, int roboID, String greeting, String securityProtocol) {
        this.fuelEmpty = fuelEmpty;
        this.roboID = roboID;
        this.greeting = greeting;
        this.securityProtocol = securityProtocol;
    }
    

    所以看看所有其他构造函数最终将如何在内部调用

    public Robot(boolean fuelEmpty, int roboID, String greeting, String securityProtocol) 
    

    这将为您提供保证,无论调用哪个构造函数,机器人都已完全创建,并且可以调用所有这些方法而不会崩溃

    【讨论】:

    • 您是否更喜欢在无参数构造函数中调用this(false, 0, "", ""); 而不是this(0),是否有特定的原因?澄清一下:它没有任何问题,我会使用“更短”的构造函数,所以我只是好奇你为什么选择另一个:) 选择背后是否有任何“标准”,或者只是你的偏好?
    • 不...我只是详细说明了 OP 的多个选项
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多