【问题标题】:how to define public variable in java which cannot be modified如何在java中定义不能修改的公共变量
【发布时间】:2016-07-03 00:06:58
【问题描述】:

我希望类的每个对象都能够访问类变量,但不想在类外被修改。 比如Array.length的使用方式。

但也希望在类中有一个有条件地修改此变量的方法。

基本上这种用法是用于调整对象数组大小的实现,其中对象数组的长度可以动态变化。

【问题讨论】:

    标签: java class variables object


    【解决方案1】:

    这里似乎有一些令人困惑的地方。

    我希望类的每个对象都能够访问类变量,但不想在类外被修改。比如Array.length的使用方式。

    Array.length(实际上)是一个最终字段——Java 中数组的长度不能改变,因此不能从类内部修改它。

    但也希望在类中有一个有条件地修改此变量的方法。

    如果一个变量是 final 的,就像数组中的 length 字段,那么它的值根本不能被任何东西修改。

    您不会直接从字段中获得这种级别的控制。相反,您应该遵循标准的 getter 模式 - 将字段设为私有且非最终的,提供一个公共方法来获取其值(例如 getLength()),然后根据需要在该类中设置它。这使您可以根据需要灵活地从类中更改值,同时仍然允许从其他任何地方读取值。

    【讨论】:

    • 我了解getter和setter的用法。但我正在尝试实现一个类似长度功能的数组,其中长度不是固定的,并且可以根据添加的新对象进行更改。但我很好奇是否有一种方法可以实现这一点而无需声明新方法。如果没有人尝试或不可能,我想我会诉诸传统方式。我是新手。
    • @YogeshLuthra 你说 - array like length feature where length is not fixed and can change based on new objects added。但是,这是不正确的 - 数组的长度 固定的。 ArrayList 集合类的长度不是固定的(动态大小),但因此您会发现长度是通过 getter 方法 (getSize()) 获得的,而不是最终变量。
    【解决方案2】:

    Array.length 被标记为final,因此在构造函数返回后无法修改。我不知道你在说什么。

    我猜,你想要一个包含公共 getter 和私有 setter 的私有字段?

    private int someField = 0;
    
    public int getSomeField() { return someField; }
    
    private void setSomeField(int newValue) {
        if (someCondition) {
            someField = newValue;
        }
    }
    
    • 由于someFieldsetSomeField 都是私有的,因此该类之外的任何代码都不能修改someField 的值。
    • 外部代码只能获取someField的值。
    • 类内的代码可以通过调用setSomeField有条件地设置someField的值。

    满足要求!

    【讨论】:

      【解决方案3】:

      我认为我想做的事情可以通过 ArrayList 实现来完成。感谢您的回复。

      【讨论】:

        猜你喜欢
        • 2015-04-07
        • 2021-09-19
        • 2016-06-02
        • 2013-08-08
        • 1970-01-01
        • 2015-03-17
        • 1970-01-01
        • 2015-11-03
        • 1970-01-01
        相关资源
        最近更新 更多