【问题标题】:(Java) modifying public static variables(Java) 修改公共静态变量
【发布时间】:2015-04-07 07:59:50
【问题描述】:

这里有点新。

无论如何,我对 Java 比较陌生,这些是来自 uni 的一些练习题,我有一个问题。 我怎样才能使 TOTAL_RESERVES 不能被外部修改。现在如果我说

Gold.TOTAL_RESERVES = 500;

这会改变它的价值。 我如何使它只有构造函数更改值。

我知道我可以将其设为私有,但我希望它在 API 中。

这是参考 API

http://www.eecs.yorku.ca/course_archive/2014-15/W/1030/sectionZ/hw/doc/Gold/index.html

public class Gold
{
    static int TOTAL_RESERVES = 100;
    private int weight;

    public Gold (int weight)
    {
        TOTAL_RESERVES -= weight;
        this.weight = weight;
    }

    public int getWeight()
    {
        return this.weight;
    }

    public static int remaining()
    {
        return TOTAL_RESERVES;
    }

    @Override
    public String toString ()
    {
        return "Weight = " + this.weight;
    }
}

谢谢!

【问题讨论】:

  • 如果整个宇宙中有一个字段我会设为私有,那就是Gold.TOTAL_RESERVES.
  • 是的,我也是这么想的,但是 API 会显示它(也必须做 Javadoc),所以它是公开的。 =/ 可以记录私有变量吗?这似乎是错误的。 xD
  • @Nesan 你为什么把它变成静态的?
  • 使用final 并使其成为常量
  • @Nesan 在 API 中明确指定了声明:“public static final int TOTAL_RESERVES”,那么为什么要更改该声明?

标签: java constructor static private public


【解决方案1】:

关于您指定的 API,您的代码应类似于:

public class Gold {

    public static final int TOTAL_RESERVES = 100;

    private int weight;

    private static int remainingWeight;

    static {
        remainingWeight = TOTAL_RESERVES;
    }

    public Gold(int weight) {

        if (remainingWeight <= 0) {

            this.weight = 0;
            remainingWeight = 0;
        }

        else {
            if (weight >= 0) {
                if (weight > remaining())
                    this.weight = remaining();
                else
                    this.weight = weight;
            } else {
                this.weight = 0;
            }

            remainingWeight -= this.weight;
        }
    }

    public int getWeight() {
        return this.weight;
    }

    public static int remaining() {
        return remainingWeight;
    }

    @Override
    public String toString() {
        return "Weight = " + this.weight;
    }

    public static void main(String[] args) {

    }
}

【讨论】:

  • 但是剩余()不会总是返回 100 吗?
  • 嘿,谢谢!顺便说一句, static { remainingWeight = TOTAL_RESERVES; 到底是什么? } 做?对我来说是新语法。
  • @Nesan 它是一个静态初始化块,您可以从这里了解更多信息:docs.oracle.com/javase/tutorial/java/javaOO/initial.html
【解决方案2】:

老实说,将其设为私有是解决此问题的最佳方法。它不是您想要的答案......但它是最好的解决方案。

【讨论】:

  • 是的,我也是这么想的,但是 API 会显示它(也必须做 Javadoc),所以它是公开的。 =/
【解决方案3】:

在文档中,TOTAL_RESERVES 的字段详细信息是 public static final int TOTAL_RESERVESfinal 修饰符意味着TOTAL_RESERVES 是一个常数。要跟踪当前储备,您需要创建另一个变量,如下所示:

private static int CURRENT_RESERVES = TOTAL_RESERVES;

并用它减去重量并返回剩余的储备。

【讨论】:

  • 是的,这似乎是最合理的解决方案。我想用一个领域做这整件事是不可能的。谢谢!我明天和教授核实一下。
猜你喜欢
  • 1970-01-01
  • 2015-10-05
  • 2011-09-23
  • 2015-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-30
相关资源
最近更新 更多