0

假设我有游戏中的场景列表和玩家列表。每个玩家从游戏中的场景列表中播放一些场景。我不想在 Player 中有 Scenario 的副本,我希望在 Game 对象中有指向列表的指针之类的东西,这样如果编辑了任何场景,它也会在 Player 列表中进行编辑。

Game
Scenarios : list

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

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

4

4 回答 4

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

作为一个经验法则:如果你不混淆(交换、分配等)引用,并且只调用引用指向的对象上的方法,那么就可以了。

于 2013-11-04T12:53:33.183 回答
1

第一种方式

我会在你的情况下使用接口。就像是:

public class Scenario implements  ScenarioItf{/**/}

并且Player只会存储ScenarioItf

第二种方式

要将Scenarios列表存储到工厂类中:

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可以使用同一个源。

于 2013-11-04T12:54:25.600 回答
1

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

于 2013-11-04T12:58:35.600 回答
0

Java 是通过引用传递的,因此如果您在列表和 Player 对象中有一个 Scenario 对象,它们都将是指向内存中实际 Scenario 对象的指针。

编辑:显然,这是一种引用,但从技术上讲并非如此。只要你不去scenario = new Scenario()任何一端,它就会是同一个对象。

于 2013-11-04T12:55:52.790 回答