如何用map创建类对象的副本?

时间:2016-03-20 04:37:04

标签: java multithreading dictionary clone immutability

我有一个班级

public class student 
{
  private int Id;
  private map<String , String> subjects;
  private map<String , String> teachers;
  private String name; 
}

让我更清楚地解释一下情景。我有一个将Student对象作为参数的函数。从其他各种类调用此函数。现在在这个函数中,我创建了七个线程来根据学生输入对象执行一些计算。虽然目前没有修改学生对象。我仍然希望通过传递student对象的副本来保证它的安全,这样如果以后有人修改任何线程中的输入它不应该修改其他线程。

那么如何为地图创建新对象? 我可以尝试的另一个解决方案是将此类创建为不可变但即使这样地图也是一个问题。 如何使地图不变。

1 个答案:

答案 0 :(得分:1)

如果线程必须操纵对象:

  • 创建对象和地图的副本,例如使用Map<String, String> subjects = new HashMap<>()
  • 如果您的对象变得越来越复杂,请使用副本库(如推土机)或使用序列化(如jaxb)

如果线程不必操纵对象:

  • 只是将同一个实例传递给所有线程
  • 为了安全起见,您可以使用Collections
  • 中的方法使地图不可变

顺便说一下:

  • 考虑存储Subject个对象和Teacher个对象的列表。与使用地图相比,这使您的代码更容易扩展。