Мне нужно построить класс, например, Apple или Strawberry из существующего объекта Fruit.
Это мой класс Fruit:
public class Fruit {
int somevariable;
Thread somethread;
public Fruit(int somevariable) {
this.somevariable = somevariable;
this.somethread = new Thread() {
public void run() { /* Something here */ }
}
this.somethread.start();
}
public Fruit(Fruit fruit) {
this.somevariable = fruit.somevariable;
this.somethread = fruit.somethread;
}
}
А это мой класс Apple и Strawberry:
public class Apple extends Fruit {
public Apple(Fruit fruit) {
super(fruit);
}
}
public class Strawberry extends Fruit {
public Strawberry(Fruit fruit) {
super(fruit);
}
}
И у меня есть HashMap вот так:
HashMap<Integer, Fruit> fruits = new HashMap<>();
Сначала я добавляю фрукты вот так: (Все, что я знаю, это то, что это фрукт на данный момент. Я могу ' я не могу сразу добавить яблоко или клубнику.)
fruits.put(17, new Fruit(4));
fruits.put(24, new Fruit(8));
fruits.put(95, new Fruit(12));
И когда я узнаю, что это за фрукт, мне нужно заменить фруктовый объект яблоком или клубникой (тем же фруктовым объектом, что и супер объект). Конечно, не останавливая что-то.
И вот как я это решаю:
fruits.replace(17, new Strawberry(fruits.get(17)));
fruits.replace(24, new Apple(fruits.get(24)));
fruits.replace(95, new Strawberry(fruits.get(95)));
Мои вопросы:
Можно ли это сделать проще? Правильно ли мое решение?
И еще один вопрос, если у меня есть функции в клубнике, которые часто вызываются из других потоков, как убедиться, что нет проблем при замене значения хэш-карты?
Большое спасибо за вашу помощь:)