让我们说我有游戏中的场景列表和玩家列表。每个玩家在游戏中的场景列表中播放一些场景。我不想在Player中拥有Scenario的副本,我希望在Game对象中有类似于指向列表的指针,这样如果编辑了任何场景,它也会在播放器列表中进行编辑。
Game
Scenarios : list
Player
Scenarios : list -> each scenario here is a reference to scenario in Game
现在支持指针的语言很简单,但Java应该是按值传递的。与此同时,我知道有些黑客在表格中使用传递值等。是否可以这样做?
答案 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;
}
}
因此,Player
和Game
类都可以使用相同的来源。
答案 2 :(得分:1)
在您的情况下,如果Player对象具有Scenario对象,则不会复制(或克隆)整个场景,只会复制场景的引用。您可以通过Player或List的引用来修改Scenario;因为它是一个很多引用的对象。
答案 3 :(得分:0)
Java是pass-by-reference,因此如果在List对象中有一个Scenario对象,它们都将成为指向内存中实际Scenario对象的指针。
编辑:显然,这是一种参考,但技术上并不是真的。只要你不在任何一端去scenario = new Scenario()
,它就会是同一个对象。