我有一个用户是某个职业,所以我有这样的东西:
public abstract class Job
{
private static String name;
public static String getJobName() { return name; }
}
和
public class Baker extends Job
{
// I realize this is probably wrong, but not the main point
Baker() { name = "Baker"; }
}
然后我想把用户->职业存储在类似的地图中
Map<User, Class<? extends Job>> uJobs = HashMap<User, Class<? extends Job>>();
uJobs.put(user, Baker.class); // This seems to work
String jobName = uJobs.get(user).getJobName(); // This not so much, and the IDE (eclipse) just somes 'class' specific stuff, not Job specific stuff.
欢迎提出任何建议。这里的核心目标是将1个对象映射到一个类,我可以直接从中调用静态方法,而不需要每个对象都有一个实例。
不要把类对象放在哈希图中,只放一个类的实例。
Map<User,Job> uJobs=new HashMap<User, Job>();
uJobs.put(user, new Baker());
String jobname=uJobs.get(user).getJobName();
更好的是,您可能不需要在每次添加用户时创建Baker的新实例。制作一个静态或单例。
class Baker extends Job
{
public static Job instance=new Baker();
public String getJobName()
{
return "Baker";
}
}
...
uJobs.put(user, Baker.instance);
如果区分作业的唯一因素是数据,则不需要进行子类化。你可以说
class Job
{
public static Job BAKER=new Job("baker", 7);
public static Job BUTCHER=new Job("butcher", 12);
public static Job CANDLESTICK_MAKER=new Job("candlestick maker", 27);
private String name;
private int whateverCode;
pubilc Job(String name, int whateverCode)
{
this.name=name;
this.whateverCode=whateverCode;
}
public String getJobName()
{
return name;
}
public int getWhateverCode()
{
return whateverCode;
}
}
...
uJob.put(user, Job.BAKER);
如果作业集是预定义的(这似乎是因为你想为每个作业创建一个类),Java的方法是将作业放在一个枚举中-所以你的应用程序中只有一个BAKER对象,而不使用Singleton模式,这在你的情况下显然是一个糟糕的设计:
public enum Job {
BAKER("Baker"),
TEACHER("Teacher");
private final String name;
private Job(String name) {this.name = name;}
public String getName() {return name;}
}
然后你可以使用地图:
Map<User, Job> uJobs = new HashMap<User, Job>();
uJobs.put(user, Job.BAKER); // This seems to work
String jobName = uJobs.get(user).getName();
您可以使用Singleton Patern
另一点是,当调用uJobs.get(user).getJobName()
时,变量name
不等于"Baker",因为已经调用了任何Baker实例。
听起来您想要实现一个Singleton。在这种情况下,我不建议使用静态变量。您想要的是所有对象的Singleton缓存。
public class JobCache {
private Map<User, ? extends Job> internalCache;
private static final JobCache instance;
private JobCache() {}
public static JobCache getInstance() {
if (instance == null)
instance = new JobCache();
return instance;
}
public void putJob(User u, Job j) {
internalCache.put(u, j);
}
public Job getJob(User u) {
return internalCache.get(u);
}
}
如今,单身汉是不受欢迎的。这是因为测试它们更困难,因为你不能创建它们的实例并传递它们。但这是一个高级话题。目前,单例应该可以解决您的问题。