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 时理解得很好,它将创建一个名为 myExample 的 Example 实例,其中 id = externalID 和 docs = null。

我想要这个类做的是:从将创建一个实例(myExample)的外部点同时调用 myMethod,并确保外部调用不能覆盖 myExample 的任何变量(线程安全?)我还希望它做的是从适当的 myExample 实例中的外部调用填充 docs 数组。这是可能的,还是我必须同时传递带有 startid 的 ArrayList?

4

2 回答 2

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

然后使用 Map 如下:

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)您的网络服务获取带有 id 的信息

2)您的服务器应用程序存储一个实例映射,您可以通过 ID 访问它(参见上面的映射示例)。在您调用的网络服务中

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 回答