java 如何在对类的多次调用中保持字段的相同值

mzmfm0qo  于 2023-01-04  发布在  Java
关注(0)|答案(4)|浏览(121)

我遇到了一个问题,基本上无法解决,我正在尝试为一栋房子构建代码,我想给房子打多个电话,而不必每次都开灯
我的字段值

private boolean turnon = false;

然后我的开灯方法

public void turnon() {
   
    turnon = true;
}

基本上我想避免的是,不要每次我想添加一个新的House时都调用这个方法,基本上一旦我打开它,它就会为类的每个示例打开。

House x = new House();
x.turnon();

假设我创建了另一个类House

House y = new House();

我希望灯在y点打开因为我已经在x点打开了
我尝试静态定义方法,但它不工作,任何建议将不胜感激

fafcakar

fafcakar1#

在House类中,添加以下内容:

public House() {
    turnon();
}

我发现OP不想让第一个灯亮起来,所以你可以用boolean的参数做一个构造函数,叫做“lightsOn”,如果为真,它会亮起来,如果为假,就不会。

public house(boolean lightsOn) {
    if (lightsOn) {
        turnon();
    }
}

或者,您可以简单地添加另一个带参数的构造函数,并且只在“House”的第一个示例上调用该构造函数

public House() {
    turnon();
}

// Only for the first house
public House(boolean lightsOff) {
    turnon = false;
}
ndh0cuux

ndh0cuux2#

无论何时创建新房子,都可以在构造函数中初始化字段turnOn的值(注意驼峰大小写约定)。

public House(boolean turnOn) {
// initializing other fields 
        this.turnOn = turnOn; 
    }

然后,您可以提供常规的getter和setter来访问turnOn字段。当创建其他房屋时,您可以简单地使用无参数构造函数。

public House() {
// initializing other fields 
       
    }
7xllpg7q

7xllpg7q3#

造成这里混乱的根本原因是:“House”和灯“Switch”不属于同一类!
所以我认为你应该把房子和开关作为不同的类来建模,并且让房子对象“聚合”一组“开关”和房子里的其他对象。
例如:

class House {
  List<ElectricalFitting> devices;
}

class Switch extends ElectricalFitting {
...
}
wqsoz72f

wqsoz72f4#

你可以提取灯光的默认状态作为一个基类的静态字段。你的House类扩展了这个基类,继承了默认状态字段,并在它的构造函数中将默认值复制到示例状态。两个setter同时改变默认值和示例状态。
例如,如果默认状态为灯光关闭(false),则House的每个新示例都将其灯光关闭。
但如果在一个房子中打开灯光(true),则默认值将更改为true,并且每个新示例都打开灯光。
House的每个现有示例在打开或关闭灯光时独立于所有其他House。

public abstract class HouseBase {
    
    protectet static boolean defaultSwitchState = false;
    
}

public class House extends HouseBase {
    
    private boolean turnOn = false;
    
    
    public House() {
        turnOn = defaultSwitchState;
    }
    
    
    public void turnOn() {
        super.defaultSwitchState = true;
        turnOn = true;
    }

    public void turnOff() {
        super.defaultSwitchState = false;
        turnOn = false;
    }

}

相关问题