如何在java中创建具有公共元素的多个列表

时间:2013-11-04 12:51:48

标签: java list

让我们说我有游戏中的场景列表和玩家列表。每个玩家在游戏中的场景列表中播放一些场景。我不想在Player中拥有Scenario的副本,我希望在Game对象中有类似于指向列表的指针,这样如果编辑了任何场景,它也会在播放器列表中进行编辑。

Game
Scenarios : list

Player
Scenarios : list -> each scenario here is a reference to scenario in Game

现在支持指针的语言很简单,但Java应该是按值传递的。与此同时,我知道有些黑客在表格中使用传递值等。是否可以这样做?

4 个答案:

答案 0 :(得分:1)

你有什么尝试?如果您尝试将引用放入单独的列表中,您就会知道它们是相同的引用。术语“按值传递”在这里很棘手,因为您将获得对方法中相同对象的引用,例如java传递引用副本。所以基本上java传递 引用的值

如果您在所有列表中添加相同的引用,原始更改将反映在其中。

SomeObject o = new SomeObject();

list0.add(o);
list1.add(o);
list2.add(o);

o.setSomeValue(true);

// all lists will "see" the changes

list0.get(0).equals(o); // assuming list0 only contains o -> this is true

根据经验:如果你没有使用引用混乱(交换,分配等)并且只对对象调用方法,引用指向你就没问题。

答案 1 :(得分:1)

第一路

我会在你的情况下使用界面。类似的东西:

public class Scenario implements  ScenarioItf{/**/}

Player只会存储ScenarioItf

第二路

Scenarios列表存储到Factory类中:

public class ScenariosFactory {

    private static List<Scenarios> mScenarios = null;


    public static void create(List<Scenarios> scenarios) {
        mScenarios = scenarios;
    }


    public static List<Scenarios> getFactory(){
        if ( mScenarios == null )
            throw new NullPointerException( "...null..." );
        return mScenarios;
    }
}

因此,PlayerGame类都可以使用相同的来源。

答案 2 :(得分:1)

在您的情况下,如果Player对象具有Scenario对象,则不会复制(或克隆)整个场景,只会复制场景的引用。您可以通过Player或List的引用来修改Scenario;因为它是一个很多引用的对象。

答案 3 :(得分:0)

Java是pass-by-reference,因此如果在List对象中有一个Scenario对象,它们都将成为指向内存中实际Scenario对象的指针。

编辑:显然,这是一种参考,但技术上并不是真的。只要你不在任何一端去scenario = new Scenario(),它就会是同一个对象。