2013-07-13 57 views
-1

我在java中有一个游戏,大约有7000个游戏块。每件作品扩展了一个名为Card的基础对象。每件作品都有不同的属性(它可以做什么)。 如何在java中通过名称检索对象


我需要能够通过调用它们的名称来动态加载这些对象。所以说用户想使用名为“卡号1”的卡片,他会输入“卡号1”,然后它应该创建一个新的“卡片1号”对象。我如何去做这件事?
我曾考虑过将每个对象放在一个Hashtable中,并使用它的名字作为关键字。任何更好的想法?
编辑: 我已经有了编程的卡片对象。我只是不知道如何加载它们。我需要能够通过使用他们的名字来检索它们,而不是创建一个新对象并将其命名。这是因为我必须编程每个单独的效果。

+1

对象不具有*名称,除非您给他们(例如通过'name'字段)。如果你正在考虑你的*变量*名称,它们是非常不同的。变量仅在编译时指定 - 您不能在执行时创建新字段。 –

+0

@jonskeet谢谢,虽然我明白了,但这就是为什么我很难理解如何去做这件事。基本上它应该是一个非常小的“yu-gi-oh”喜欢的游戏。但我不习惯从面向对象的角度来思考。 – snocavotia

回答

0

如果每张卡都有一个类文件,并且你想在被调用时创建一个新对象,那么你想要的不需要涉及哈希表。做这样的事情,而不是(编程实例化类):

import java.lang.reflect.*; 
import java.lang.reflect.Constructor.*; 

String cardName = <whatever> 
Card newCard = Class.forName(cardName).getDeclaredConstructor().newInstance(); 

如果棋子使用对象来表示,而不是类文件(即你没有7 000多种不同的类文件),则每张卡都要有name领域。在这种情况下,你可能要做的就是将它们全部放在一个hashmap中,并用它们的名字作为关键字。然后,当您想制作特定类型的新卡片时,请检索其对象并致电clone()

+0

Thank you(:so much! – snocavotia

+0

很高兴我能帮忙,只是好奇 - 你其实有7,000个档案文件吗? –

+0

7000只是一个数字,我有150个左右的游戏片段,是的,我有一个类文件每一个因为他们的效果都是不同的,并且必须是硬编码的。 – snocavotia

0

我想你正在努力实现这是

由于用户类型的卡没有1,创建一个新的对象与价值“卡NO1”设置一个特定的属性。所以一旦用户卡片输入一些名称,创建新的对象

String userInput= req.getParamter("cardSeq"); 
Card card1 = new Card(); 
card1.setName(userInput) 

虽然答案很简单,但是这是我认为你正在努力实现。

0

您已经知道从7000张卡片HashMap中获取卡的最佳方式。 与同步有关的原因,使用HashMap而不是HashTable。

还记得重写hashCode和等于正确的方法。