【问题标题】:Best practice for sharing instances between Objects在对象之间共享实例的最佳实践
【发布时间】:2014-01-21 00:21:09
【问题描述】:

假设我有一个班级MainActivity

这包含存储在字段中的许多对象,例如PlayerEnemyLevel 等的实例。这些对象中的每一个都需要能够引用其他所有对象。

最好的方法是什么?

  1. 将这些字段设为静态,并相应地引用它们,即

    MainActivity.player.setHealth(0);
    
  2. 为每个字段创建getter方法,并简单地将每个对象的引用传递给MainActivity,这样他们就可以调用这些getter方法,即

    mainActivity.getPlayer().setHealth(0);
    
  3. 向每个对象传递对每个其他对象的引用,并将这些引用存储在每个对象的字段中,以便可以直接引用它们,即

     player.setHealth(0);
    

【问题讨论】:

  • 在你的简单场景中......如果 Player 只有 1,那么你有一个单独的类是有意义的,并在那个 Player.setHealth() getHealth()而不是去主要活动。 -- 玩家应该是单身人士。 Level 也应该如此,因为这些东西你一次只能拥有一个。
  • 所以如果只有 1 个玩家,让它完全静止?如果有 2 个或更多玩家怎么办?
  • 如果你一次只有 1 个玩家活跃,那么我会使用单例玩家类,否则不会。

标签: android android-activity visibility sharing instances


【解决方案1】:

在此处查看 Android 文档:http://developer.android.com/guide/faq/framework.html#3。还可以将您的对象序列化为原始数据类型,并将您的 Intent 中的这些数据类型传递给新的 Activity。

【讨论】:

  • 我说的是对象能够在单个 Activity 中相互引用,而不是在多个 Activity 之间。
【解决方案2】:

不是一个真正的答案,只是给你一些提示。

你的播放器应该是这样的:

public class Player
{
    private static Player _player = null;
    int _health;
    ...

    public static Player getInstance()
    {
        if (_player == null)
            _player = new Player(...);

        return _player;
    }

    public void increaseHealth(int amount)
    {
        _health += amount;
    }
 }

然后,当您需要播放器时,您可以在应用程序的任何部分执行以下操作:

Player p = Player.getInstance();

你会一直得到同一个播放器。您可以对您的关卡类做类似的事情,因为任何时候只有 1 个关卡会处于活动状态。

然而,Enemy 类将需要不同的方法。我会在 Level 类中创建一个 List 并像这样获取它们:

Level l = Level.getInstance();
List<Enemy> enemiesOnLevel = l.getEnemies();
// do something with them

【讨论】:

  • 最后我确实使用了 Singleton 模式,不仅适用于 Player,而且适用于包含与游戏当前状态相关的所有数据的“GameState”类。
【解决方案3】:

在活动之间共享对象的更多选项是使用 parcable,我认为这可能是性能最高的方法,以及共享偏好。

在我以前学习的应用程序中(我对android编程知之甚少),我使用gson将对象序列化为json,然后将其存储在活动A的共享首选项中,然后从活动B中的共享首选项重新创建它,然后再次存储。

【讨论】:

    猜你喜欢
    • 2016-01-19
    • 1970-01-01
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多