[Android] オブジェクトが null になる理由の 1 つは、メソッド内で新しいオブジェクトが再作成され、元のオブジェクトに割り当てられますが、これによって元の元のオブジェクトの参照が変更されることはありません。

疑い

次のようなコードを作成します。

private GameList multiGameList;

/**
 * 获取多人游戏列表
 *
 * @return 多人游戏列表
 */
public GameList getMultiGameList() {
    
    
    if (null == multiGameList) {
    
    
        createMultiOrSingleGameList(multiGameList,GameList.TYPE_MULTI);
    }
    return multiGameList;
}

/**
 * 创建多人或者单人游戏列表
 * @param gameList 游戏列表容器
 * @param type 游戏类型,1为单人,2为多人
 */
private void createMultiOrSingleGameList(GameList gameList, int type) {
    
    
    gameList = new GameList();
    for (GameList.Game game : bizGameList.getList()) {
    
    
        // 当为多人或者单人游戏的时候整理到游戏列表中
        if (game.getGameType() == type) {
    
    
            gameList.getList().add(game);
        }
    }
}

他のクラスの getMultiGameList() メソッドを呼び出して取得したオブジェクトが依然として null なのはなぜですか? この方法で記述すると何が問題になりますか? なぜですか? それを避けるにはどうすればよいでしょうか?

答え

問題は createMultiOrSingleGameList メソッドにあり、渡す gameList パラメータはオブジェクトへの参照です。メソッド内で、新しい GameList オブジェクトを再作成して gameList に割り当てますが、元の multiGameList オブジェクトへの参照は変更されません。

これを修正するには、パラメータを使用して変更するのではなく、新しい GameList オブジェクトを返すように createMultiOrSingleGameList メソッドを変更します。次に、getMultiGameList メソッドで、返された新しいオブジェクトを multiGameList に割り当てます。

変更されたコードは次のようになります。

private GameList multiGameList;

/**
 * 获取多人游戏列表
 *
 *  多人游戏列表
 */
public GameList getMultiGameList() {
    
    
    if (null == multiGameList) {
    
    
        multiGameList = createMultiOrSingleGameList(GameList.TYPE_MULTI);
    }
    return multiGameList;
}

/**
 * 创建多人或者单人游戏列表
 *  type 游戏类型,1为单人,2为多人
 */
private GameList createMultiOrSingleGameList(int type) {
    
    
    GameList gameList = new GameList();
    for (GameList.Game game : bizGameList.getList()) {
    
    
        // 当为多人或者单人游戏的时候整理到游戏列表中
        if (game.getGameType() == type) {
    
    
            gameList.getList().add(game);
        }
    }
    return gameList;
}

この変更後、getMultiGameList メソッドを呼び出すと、null ではなく正しい multiGameList オブジェクトが返されるようになります。

おすすめ

転載: blog.csdn.net/weixin_44002043/article/details/131901883