我正在用Java制作2D游戏。我有一个精灵类和一个瓷砖类。首先,我在精灵类中声明了一些静态精灵对象
public class Sprite {
public static Sprite grass = new Sprite(0, 0, Spritesheet.testTiles);
...
然后我在 Tile 类中声明了静态 Tile-对象,并将静态 Sprite 对象作为参数传递,如下所示:
public class Tile {
public static Tile grass = new Tile("grass", Sprite.grass);
...
但是由于某种原因,我传递的精灵为空。知道为什么吗?
每当我在其他地方使用草对象时,我都没有问题。
这完全是意料之中的,静态初始化发生在不同的事件上,这些事件在您分配之前都没有发生,因此静态属性无论如何都是空的。
有关事件的更多详细信息,请参阅此帖子
类装入器如何加载静态变量的说明
事实证明,这是循环依赖的问题。我在 Tile-class 中有一个静态变量 (TILE_SIZE(,我在代码的其他地方使用了它,包括 Sprite 类。我移动了精灵类中的变量,并将依赖项删除为磁贴类。
源语言:
import ge.game.Tile;
public class Sprite {
public static Sprite grass = new Sprite(0, 0, Spritesheet.testTiles);
...
import ge.graphics.Sprite;
public class Tile {
public static Tile grass = new Tile("grass", Sprite.grass);
public static int TILE_SIZE = 16;
...
新增功能:
public class Sprite {
public static Sprite grass = new Sprite(0, 0, Spritesheet.testTiles);
public static int SPRITE_SIZE = 16;
...
import ge.graphics.Sprite;
public class Tile {
public static Tile grass = new Tile("grass", Sprite.grass);
...
谢谢!
Tile.grass
字段的初始化早于 Sprite.grass
。下面的问题提供了一些关于它的见解。
Java :静态最终字段初始化的顺序是什么?
对此的解决方案可能是将Sprite.grass
和Tile.grass
转换为单例,并通过一种方法访问它们:
class Sprite {
private static Sprite grass;
public static Sprite getGrassInstance(){
if(grass == null){
grass = new Sprite(0, 0, Spritesheet.testTiles);
}
return grass;
}
}
但请注意它们之间的循环依赖关系,以避免无限循环。