将静态类指针存储在Java中的映射中



我有一个用户是某个职业,所以我有这样的东西:

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);
  }
}

如今,单身汉是不受欢迎的。这是因为测试它们更困难,因为你不能创建它们的实例并传递它们。但这是一个高级话题。目前,单例应该可以解决您的问题。

最新更新