【问题标题】:Toggle variables in other classes without setters/getters在没有 setter/getter 的情况下切换其他类中的变量
【发布时间】:2021-12-07 07:51:10
【问题描述】:

我目前有一个名为 UserSettings 的对象,其中包含许多用户偏好变量。

在另一个名为playerLabels 的类中,我像这样实例化对象: public static UserSettings settings = new UserSettings();

在第三类中,我从文件中读取并通过执行(例如)playerLabels.settings.setToggled(true); 来编辑设置对象

我在设置文件中有许多布尔值,其中一些我想切换(打开->关闭或关闭->打开)。 从我的角度来看,有三种方法可以做到这一点:

  1. playerLabels.settings.toggled = !playerLabels.settings.toggled;
  2. playerLabels.settings.setToggled(!playerLabels.settings.getToggled());
  3. settings 中为每个布尔值创建一个切换方法

我学会了在 java 中使用 setter 和 getter,而不是直接访问变量,这就是我不想做第一个的原因。

第二个有点长,感觉很笨拙,但如果是这样的话,那很好。

第三种方法为每个布尔值创建方法会很耗时。

我感觉我存储用户首选项的方法并不理想,因为我正在访问另一个不必要的类 (playerLabels) 来编辑设置。如果有更好的方法以我想要的方式存储变量,那将很有帮助。

谢谢

用户设置:

public class UserSettings {
    private boolean toggled = true;
    private float height = 0f;
    private boolean shadow = true;
    private boolean personal = false;

    public boolean isToggled() {
        return toggled;
    }

    public void setToggled(boolean toggled) {
        this.toggled = toggled;
    }

    public float getHeight() {
        return height;
    }

    public void setHeight(float height) {
        this.height = height;
    }

    public boolean isShadow() {
        return shadow;
    }

    public void setShadow(boolean shadow) {
        this.shadow = shadow;
    }

    public boolean isPersonal() {
        return personal;
    }

    public void setPersonal(boolean personal) {
        this.personal = personal;
    }

}

【问题讨论】:

  • 其实 getter 和 setter 比 playerLabels.settings.toggled = !playerLabels.settings.toggled;

标签: java class object oop


【解决方案1】:

简而言之,您必须在包含私有变量的类中编写一个方法。创建私有变量的全部目的是限制访问,从而封装变量。如果要切换它,请编写一个使用 getter/settings 的方法来切换它。

【讨论】:

  • 有道理,谢谢,我可以将变量存储在一个类中而不必通过 playerLabels.settings 还是我现在这样做的方式更好。
  • 把你正在编写的类想象成一个物理对象。如果属性属于对象,则应直接在对象上设置,并且应使用方法对其进行更改。如果您使用一种名为 settings 的方法来初始设置对象,那效果很好。您还可以考虑编写一个构造函数,在设置对象时设置变量。只需将要设置的值传入构造函数,然后在构造函数代码中调用设置器。
  • 这很有帮助,谢谢,我没有使用构造函数的原因是因为当我在 playerLables 中实例化它时,它当时没有任何属性。这些取自另一个类中的文件并设置在那里。也许我应该在我从文件中读取值的类中实例化该类
【解决方案2】:

如果你真的想偷懒不为每个设置添加一个toggle()方法,你可以新建一个类:

public class ToggleOption {

    private boolean value;
    
    public ToggleOption() {}

    public ToggleOption(boolean initialValue) {
        this.value = initialValue;
    }
    
    get() {
        return value;
    }

    set(boolean value) {
        this.value = value;
    }

    toggle() {
        this.value = !value;
    }
}

然后,在您的 UserSettings 类中,您可以使用这个新类而不是布尔标志:

public class UserSettings {
    private ToggleOption toggled = new ToggleOption(true);
    private float height = 0f;
    private ToggleOption shadow = new ToggleOption(true);
    private ToggleOption personal = new ToggleOption();

    ...
}

要切换,您只需调用

playerLabels.settings.getToggled().toggle();

【讨论】:

  • "simply call" ...你想了解编程中的“得墨忒耳定律”。当然,上述方法可行,但它是一种反模式,您在现实世界的代码中绝对要避免。
  • 看起来不错,但是我现在正在考虑使用一个空类并将所有用户设置存储为顶部的public static 类型。这是个坏主意吗?
  • @GhostCat 添加一个带有toggle()声明的接口层然后
  • @VosemMedia 是的。 static 就像好的 OO 的反面一样。它为您提供类之间的硬耦合,它也不适用于多态性和继承。换句话说:静态应该是你的java代码中的罕见异常......
  • 哦好的我明白了,那我就坚持目前的方式。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-11
  • 1970-01-01
  • 2020-04-19
  • 2015-02-28
  • 2020-12-20
  • 2022-07-23
  • 1970-01-01
相关资源
最近更新 更多