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

一連のジョブが事前定義されている場合 (それぞれに 1 つのクラスを作成する必要があるため、そのように思われます)、Java の方法はジョブを列挙型に入れることです。したがって、アプリケーションには BAKER オブジェクトが 1 つしかなく、あなたの場合、明らかに悪い設計になるシングルトンパターンに頼る:

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

シングルトンパターンを使用できます

もう1つのポイントは、を呼び出すと、任意のBakerインスタンスが呼び出されているためuJobs.get(user).getJobName()、変数nameは「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 に答える