所以,在我的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
。我该如何解决这个问题?
非常感谢! :)
答案 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
旨在以非常具体的方式行事:其行为应该封装在一个类中。
请勿使用静态字段来描述系统的状态。
更改方法的参数名称,以避免在阅读代码时出现混淆。