传递对象作为构造函数错误

时间:2015-06-29 02:15:11

标签: java android object constructor

在我写的安卓游戏中,我的代码组织如下: 我有一个World对象,其中包含许多Area个对象。每个Area对象内部都是Place个对象。它们以多维数组排列,使玩家可以轻松移动。 我还有PlayerInventory个对象,我用作World对象的构造函数,以便ican访问Player / Inventory并根据需要对其进行更改(例如:添加“item”库存;玩家-10健康)。

public class World
 Player player;
 Inventory inventory;
public World(Player player, Inventory inventory){
     this.player=player;
     this.inventory=inventory;
}

public Player returnPlayer(){
     return player;
}
public Inventory returnInventory(){
     return inventory;
}

创建一个Area:我使用World对象作为构造函数

public class StartingArea extends Area
  Player player;
  Inventory inventory;
  World world;
  public StartingArea(World world){
     this.world=world;

     player=world.returnPlayer;
     inventory=world.returnInventory;
}

我的Area对象中也有returnPlayer和returnInventory方法。 当我在Area对象中创建Place对象时,我使用Area作为构造函数“:

 House house = new house(this);

public class House extends Place
 Player player;
 Inventory inventory;
 public House(Area area){
   inventory=area.returnInventory;
   player=area.returnPlayer
 }

然而,当我向下传递我创建player对象时创建的inventoryworld个对象时,会出现混乱。我无法访问inventory对象,我的应用程序强制关闭。我尝试将我的世界实例设为静态:

Player player = new Player();
Inventory inventory = new Inventory();
public static World world;
world = new world(player,inventory);

当它是静态的时候,我可以成功地改变库存对象 参考:

MainActivity.world.returnInventory().add(item) //add(Item item) is a method in inventory

所以,我不太明白的事情就在这里。也许这是继承问题(扩展)?或者我传递物体的方式可能是非法的还是不合适的?我刚开始学习java,所以这可能是一个简单的修复或概念性的东西,我错过了。

我想避免创建static对象的World实例,因为我不确定这会如何影响我游戏中支持多个保存文件。

1 个答案:

答案 0 :(得分:0)

如果你只有一个玩家和一个库存,你可以使用单身人士来随时随地访问它们。这样的事情。

public class Player {

    private static Player sPlayer;
    // variables etc

    public static Player getInstance() {
        if (sPlayer == null) {
            sPlayer = new Player();
        }
        return sPlayer;
    }
    // methods etc
}

public class Inventory {

    private static Inventory sInventory;
    // variables etc

    public static Inventory getInstance() {
        if (sInventory == null) {
            sInventory = new Inventory();
        } 
        return sInventory;
    }
    // methods etc
}

然后在其他活动和类中,您可以轻松获得参考,而无需将它们作为参数传递

public class StartingArea extends Area {
    Player player;
    Inventory inventory;
    World world;

    public StartingArea(World world){
        this.world=world;

        player=Player.getInstance();
        inventory=Inventory.getInstance();
    }
}