0

我有一个用户是某个职业的情况,所以我有类似的情况:

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

然后我想将 User->Profession 存储在像这样的地图中

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 个对象映射到一个类,我可以从中调用静态方法,而不需要每个对象的实例。

4

4 回答 4

2

不要将类对象放入哈希映射中,只需放入该类的一个实例即可。

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);
于 2012-08-02T18:22:43.807 回答
2

如果一组作业是预定义的(这似乎是因为您想为每个作业创建一个类),Java 方法是将作业放在一个枚举中 - 因此您的应用程序中只有一个 BAKER 对象,没有诉诸单例模式,在您的情况下这显然是一个糟糕的设计

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();
于 2012-08-02T18:23:12.667 回答
0

您可以使用单例模式

另一点,当您调用 时uJobs.get(user).getJobName(),您的变量name不等于“Baker”,因为已调用任何 Baker 实例。

于 2012-08-02T18:16:20.697 回答
0

听起来你想实现一个单例。在这种情况下,我不建议使用静态变量。您想要的是所有对象的单例缓存。

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

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

于 2012-08-02T18:22:31.407 回答