【问题标题】:About new objects [closed]关于新对象[关闭]
【发布时间】:2013-12-07 05:52:17
【问题描述】:

我在游戏中有一个用于统计的基础对象。每次我为战斗地图上的 40 个总和单位开始战斗时,我都会复制该对象。

然后我修改每个单元的 stats 对象。我当然不想通过引用传递。基本统计对象填充了大约 50 个基元。所以我创建了一个对象的构造函数类,并且繁琐地复制了每个原语。从我在谷歌上搜索的结果来看,这似乎是最安全的方式。

示例代码

class Stats{
int x;
int y;
int b;

public Stats(Stats stats)
{
this.x = stats.x;
this.y = stats.y;
this.b = stats.b;
}
}

Stats currentUnit = new Stats (currentUnitBaseStats);

-问题-

这非常令人沮丧和混乱。是否值得我花时间研究实现内置的克隆功能?

如果我的 stats 类最终包含其他对象,那么其中包含的所有对象是否也需要实现克隆功能?

有没有更简单的方法??

附带问题:在 Android 上拥有 40 个单独的 100~ 个基元类的 RAM 消耗仍然很低,对吧? 谢谢,我爱你们:)

【问题讨论】:

  • OOO 还有我没有编程的对象呢,比如 ArrayLists

标签: java android object cloning


【解决方案1】:

如果你有这么多原语 (50) 为什么不使用 HashMap 呢?:

    public static void main (String[] args)
{
    HashMap<String, Integer> stats = new HashMap<String,Integer>();
    stats.put("x",3);
    stats.put("y",4);
    stats.put("z",5);
    stats.put("b",9);
    HashMap<String, Integer> statsCopy = new HashMap<String,Integer>();

    statsCopy.putAll(stats);//this will copy all the values from the base object
}

【讨论】:

  • 哦,这真是个好主意。谢谢!!
  • 嘿,谢谢,您基本上确实“解决”了我的问题,但向我展示了一个更好的方法。非常感谢。我知道觉得自己浪费了很多时间,但不管那是什么生活。再次感谢你:)
【解决方案2】:

这是实现 Stats 类的最佳方式。它可能看起来令人沮丧和混乱,但从功能上讲,该类非常简单。

如果 stat 值永远不会出现,您可以考虑将 Stats 设为静态类。然后,您永远不需要复制它。例如:

static class Stats
{
    private int x = 10;
    private int y = 12;
    private int b = 13;
    ...
    public int getX()
    {
        return x;
    }
    public int getY()
    {
        return y;
    }
    public int getB()
    {
        return b;
    }
}

要获取这些值,您将调用 Stats.getX(),并且永远不必实例化 Stats 类。缺点是所有引用它的对象的 Stats 都是相同的。

如果您需要独立的统计值,您应该使用您当前的实现。

如果所有 stat 对象的起始值都相同,您可以创建一个额外的构造函数来设置这些值。

class Stats{
    int x;
    int y;
    int b;

    public Stats()
    {
        this.x = 10;
        this.y = 11;
        this.b = 12;
    }
}

要回答您的第二个问题,假设它们都是双精度对象,那么具有 100 个基元的 40 个对象最多需要 32,000 个字节或约 32KB。在现代硬件上,这应该不是问题,但是如果您可以重复使用您的数据,我鼓励您这样做。

【讨论】:

  • 感谢您的建议,值需要更改,但我想我会改用 hashmap。感谢您解决我的 RAM 消耗问题。我试图尽可能减少我使用的内存量。我觉得这种行为非常令人愉快,哈哈。但是当我真正开始制作游戏而不是应用程序时,我发现最好放弃该领域的基础。这很难,但我正在学习放弃对工作代码的完美优化lol :)
猜你喜欢
  • 2014-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-16
  • 2013-12-30
  • 2013-11-25
  • 1970-01-01
相关资源
最近更新 更多