方法不会全局更新变量?

时间:2016-09-18 18:46:23

标签: java methods global-variables

所以,在我的java类的开头,我定义了全局: static long world;。 然后我使用world作为参数有几个函数。其中一个名为setCell的论文没有按预期工作,我无法弄清楚原因。我尝试使用println命令进行错误搜索,所以现在我的代码看起来像这样:

public static long setCell(long world, int col, int row, boolean newval){
    if(col>= 0 && col<8 && row>=0 && row<8){
      int bitPosition = col + 8*row;
      long newWorld = PackedLong.set(world, bitPosition, newval);
      System.out.println(newWorld);
      world = newWorld;
      System.out.println(world);
      return world;
    }
    else{
      return world;
    }
}

代码的主要思想是,它应该通过使用world方法(运行良好)更改其中一个位来更新PackedLong.set,然后返回新更新的{{1} }。

如果我们现在运行:

world

在main方法中,我们得到以下输出:

world =0x20A0600000000000L; System.out.println(world); setCell(world, 1, 1, true); System.out.println(world);

由此我得出结论,2350984558603665408 2350984558603665920 2350984558603665920 2350984558603665408方法中的命令按预期工作,但该方法不会在整个代码中“全局”更改setCell。我该如何解决这个问题? 非常感谢! :)

3 个答案:

答案 0 :(得分:3)

您有参数world

public static long setCell(long world, int col, int row, boolean newval)

这将隐藏全局变量,而是更新参数。你应该避免名称隐藏同一范围内存在的其他变量。而是为参数选择一个不同的名称。

答案 1 :(得分:2)

首先,使用全局变量是不好的,因为它们是隐藏的依赖。目前还不清楚一个类是否正在使用world,除非你真的去找它在代码中使用它。这样的代码很难调试。

long没有这个方法来设置它,而不是将它传递给某个静态函数,并且它更新了一些全局变量(a la C),你最好将它封装在一个提供此功能的类:

class World {
    private long world;

    public World(long value) {
        this.world = value;
    }

    public void setCell(int col, int row, boolean newval) {
        if(col>= 0 && col<8 && row>=0 && row<8){
            int bitPosition = col + 8*row;
            world = PackedLong.set(world, bitPosition, newval);
        }
    }

    @Override
    public String toString() {
        return String.valueOf(world); // Or print a hexadecimal presentation.
    }
}

类允许您制作纯数据(如long智能。它还允许您删除参数(因为它保留在内部)。

您正在更改world

也会更清楚
World world = new World(0x20A0600000000000L);
System.out.println(world);
world.setCell(1, 1, true); // Aha, 'world' is being altered
System.out.println(world);

Kelvin对您的代码不起作用的原因有正确答案。

答案 2 :(得分:0)

我相信@Jorn Vernee的答案是最好的。 https://stackoverflow.com/a/39561744/4506528

但是我会用极其糟糕的编码习惯来回答您的问题,演示如何使用语言功能实现这一目标。如果你的课程做得好,你应该从不必须这样做。

如果您的班级名为Story且名为world的静态字段,则可以使用Story.world直接从大多数位置引用该字段。这包括重新分配它。

public class Story {
    public static String world = "Saturn";

    public static void main(String[] args) {
        doStuff("Earth");
        System.out.println(world);
    }

    public static void doStuff(String world) {
        Story.world = "Europa";
        world = "Mars";
    }
}

即使这可以解答您的问题,我也不鼓励以这种方式使用静态字段。请不要将这个答案付诸实践。

  • 您的long旨在以非常具体的方式行事:其行为应该封装在一个类中。

  • 请勿使用静态字段来描述系统的状态。

  • 更改方法的参数名称,以避免在阅读代码时出现混淆。