2016-03-20 2 views
1

У меня есть классКак создать копию объекта класса с картой?

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

Позвольте мне объяснить ситуацию более четко. У меня есть функция, которая принимает объект Student в качестве параметра. Эта функция вызывается из разных классов. Теперь в этой функции я создаю семь потоков для выполнения некоторых вычислений на основе входного объекта студента. Хотя в настоящее время модификации объекта-ученика нет. Тем не менее я хочу, чтобы это было безопасно, передавая копии студенческого объекта, чтобы, если кто-либо позже вносил изменения в любой из потоков, он не должен изменять другие потоки.

Итак, как я могу создать новый объект для карты? Еще одно решение, которое я мог бы попробовать, - создать этот класс как неизменный, но даже тогда карта является проблемой. Как сделать карту неизменной.

+2

Если нить изменяет карту, вам нужно скорректировать все копии позже? Это сложная проблема. –

+0

Вы можете просто вернуть копию карты из метода getter? 'new HashMap()'. О, и вы хотите, чтобы потоки могли изменять экземпляр «Студент»? Это повлияет на все остальные потоки. –

+3

требования кажутся неясными. Вы хотите, чтобы эти потоки изменяли объект или нет? Если вы можете решить свою проблему таким образом, чтобы ваши объекты были неизменными, это самый простой и простой способ, я не понимаю, почему «карта является проблемой» здесь. возможно [Java: как сделать приватное поле? Карта неизменной внутри класса?] (http://stackoverflow.com/q/19125160/217324) связана? –

ответ

1

Если нити должны манипулировать объект:

  • создавать копии объектов и карт, например, с помощью Map<String, String> subjects = new HashMap<>()
  • если ваши объекты становятся все более сложными использовать копию библиотеки (в как бульдозер) или использовать сериализацию (как JAXB)

Если нити не должны манипулировать объект:

  • просто передать тот же экземпляр для всех потоков
  • для безопасности вы могли бы сделать карты неизменны с методами в Collections класса

Кстати:

  • считают хранение списки Subject объектов и Teacher объектов. Это упрощает расширение кода, чем использование карт.
+0

Я не могу сделать такое копирование Map subject = new HashMap <>(). Вы не знаете, может быть, карта была инициализирована как treemap или может быть связанным хэшмапом. Это моя главная забота. –

+0

Также во втором случае вы говорите, если мне не нужно манипулировать Я могу сделать карту неизменной с помощью метода сбора вы могли бы объяснить это подробно? –

Смежные вопросы