0

私は次のクラスを持っています:

public class Example(

   private String id;
   private ArrayList<String> docs = new ArrayList();

   public Example(string startid){
      id = startid;
      docs = null;
   }

   public void myMethod(String externalID){

      Example myExample = new Example(externalID);

}

myMethod を呼び出すとよく理解できれば、id=externalID、docs=null で myExample という Example のインスタンスが作成されます。

このクラスに実行させたいことは次のとおりです。インスタンスを作成する外部ポイントから myMethod を同時に呼び出し (myExample)、外部呼び出しが myExample の変数を上書きできないようにします (スレッドセーフ?)。適切な myExample インスタンス内の外部呼び出しから docs 配列に入力します。これはまったく可能ですか、それとも ArrayList に startid を同時に渡す必要がありますか?

4

2 に答える 2

1

あなたが達成したいことについてのBenoitの考えに基づいて、最善の方法はMap(またはスレッドセーフが必要な場合はConcurrentMap)を使用することだと思います:

ConcurrentMap<String, List<String>> myData = new ConcurrentHashMap<>();

このようにして、指定した ID で任意のリストをアドレス指定できます。

List<String> myList = myData.get(id);

リストのアクセサを制限したい場合 (たとえば add メソッドのみを提供する場合)、リストをクラスにカプセル化する必要があります。

public final class Example {
    private final List<String> docs = new ArrayList<>();

    public boolean addDoc(final String doc) {
        return docs.add(doc);
    }
}

次に、次のようにマップを使用します。

ConcurrentMap<String, Example> myData = new ConcurrentHashMap<>();

そして、そのようなドキュメントを追加します:

myData.get(id).addDoc(myDoc);

お役に立てれば...

コメントで議論されたトピックについて:変数の設定

あなたはこのようなクラスを持っています:

public class Example {
    public String var;
}

そして、このようなインスタンス

Example ex = new Example();

で値を設定できます

ex.var = "abc";

こんなカルスで

public class Example {
    private String var;
    public void setVar(String var) {
        this.var = var;
    }
}

使用する

ex.setVar("abc");

複数のインスタンスの管理:

1)WebサービスはIDで情報を取得します

2) サーバー アプリケーションはインスタンスのマップを保存し、ID を介してアクセスできます (上記のマップの例を参照)。あなたが呼び出すWebサービスで

Example ex = ReportHolder.getReport(id);

このようなクラスを仮定します:

public class ReportHolder {
    private static ConcurrentMap<String, Example> map = new ConcurrentMap<>();
    public static Example getReport(final String id) {
        return map.get(id);
    }
}

3) 次に、インスタンスを操作できます。

変数、クラス、インスタンス、および静的という用語を正しく理解してください。そうしないと、エラーが発生した理由を理解するのが難しくなります。

于 2013-03-07T12:43:09.687 に答える
1

あなたは間違って理解しています。

呼び出すmyMethodには、既に Example インスタンスを作成しておく必要があります。呼び出しmyMethodにより、externalId を使用して新しいインスタンスがインスタンス化され、すぐに破棄されます。

私が理解していることから、あなたが望むものは次のとおりです。

public class Example {

  // Final so it can't be modified once set.
  private final String id;

  // Final so it can't be switch to a different list.
  // Public so others can add to it and have acces to List methods.
  // Synchronized so acces to it from multiple threads is possible.
  // Note: You should probably make this private and have a getList() method that
  //       returns this instance to have nice encapsulation.
  public final List<String> docs = Collections.synchronizedList(new ArrayList());

  // Make default constructor private to force setting the startId.
  private Example() {}

  public Example(final String startId){
     this.id = startId;
  }
}
于 2013-03-07T11:26:32.257 に答える