我用Java制作2D游戏。我有一个Sprite类和一个Tile类。首先,我在Sprite类中声明了一些静态Sprite对象
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);
...
但是由于某种原因,Sprite I' m传递为null。有什么想法吗?
每当我在任何其他地方使用草对象时,我都没有问题。
答案 0 :(得分:2)
完全可以预料到,静态初始化发生在不同的事件上,在分配之前它们都不会发生,因此静态属性无论如何都将为null。
有关活动的更多详情,请参阅此帖子
答案 1 :(得分:0)
Tile.grass
字段的初始化时间早于Sprite.grass
。下面的问题提供了一些有关它的见解。
Java : in what order are static final fields initialized?
解决方法可能是将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;
}
}
但要注意它们之间的周期性依赖关系以避免无限循环。
答案 2 :(得分:0)
结果证明是循环依赖的问题。我在Tile类中有一个静态变量(TILE_SIZE),我在代码的其他地方使用过它,包括Sprite类。我在Sprite类中移动了变量,并将依赖项移除到了Tile-class。
原:
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);
...
谢谢!