Не могу подсчитать количество проданных цветов (используя статическую переменную)
Подсчитать количество проданных цветов (используем статическую переменную).
Вот мой код:
Roses rose1 = new Roses(50.5);
Roses rose2 = new Roses(53.5);
Roses rose3 = new Roses(59.5);
Violet violet1 = new Violet(45.30);
Violet violet2 = new Violet(49.30);
Violet violet3 = new Violet(45.80);
Carnations carnation1 = new Carnations(25.90);
Carnations carnation2 = new Carnations(35.90);
Carnations carnation3 = new Carnations(39.90);
Tulips tulip1 = new Tulips(39.90);
Tulips tulip2 = new Tulips(38);
Tulips tulip3 = new Tulips(37);
Daisies daisy1 = new Daisies(60.80);
Daisies daisy2 = new Daisies(65);
Daisies daisy3 = new Daisies(63.8);
Bouquet bouquet1 = new Bouquet();
bouquet1.addFlower(rose1).addFlower(violet1).addFlower(carnation1).addFlower(tulip1).addFlower(daisy1);
System.out.println(bouquet1.getPrice());
Bouquet bouquet2 = new Bouquet();
bouquet2.addFlower(rose2).addFlower(violet2).addFlower(carnation2).addFlower(tulip2).addFlower(daisy2);
System.out.println(bouquet2.getPrice());
Bouquet bouquet3 = new Bouquet();
bouquet3.addFlower(rose3).addFlower(violet3).addFlower(carnation3).addFlower(tulip3).addFlower(daisy3);
System.out.println(bouquet3.getPrice());
Ответы (1 шт):
Простой пример статического счётчика экземпляров: в верхнем классе иерархии цветов Flower заводится статическая целочисленная переменная-счётчик, которая будет инкрементироваться при вызове конструктора этого класса. Для чтения этого счётчика понадобится статический же геттер.
Конструктор Flower будет вызываться всегда при создании любых классов-потомков, тем более что в представленном коде все конструкторы вызываются с неким параметром:
public class Flower {
private static int counter = 0;
private double price;
public Flower(double price) {
this.price = price;
Flower.counter++;
}
public static int getCounter() {
return Flower.counter;
}
}
public class Rose extends Flower {
public Rose(double price) {
super(price);
}
}
Соответственно, по аналогии можно завести счётчик проданных цветов, добавить метод sell для отдельных цветов и/или букетов и инкрементировать этот счётчик при вызове метода sell.
// class Flower
private static int soldCount = 0;
private boolean sold = false;
public void sell() {
this.sold = true;
Flower.soldCount++;
}
public static int getSoldCount() {
return Flower.soldCount;
}
// class Bouquet
private List<Flower> flowers = new ArrayList<>();
public void sell() {
for (Flower f : flowers) {
f.sell();
}
}
Пример использования:
Flower rose = new Rose(123);
Flower rose2 = new Rose(120);
System.out.println("Цветов: " + Flower.getCounter() + "; продано: " + Flower.getSoldCount());
rose.sell();
System.out.println("Цветов: " + Flower.getCounter() + "; продано: " + Flower.getSoldCount());
Результат:
Цветов: 2; продано: 0
Цветов: 2; продано: 1
Однако следует обратить внимание, что такой код не является потокобезопасным (thread safe), и в случае использования нескольких потоков обязательно потребуется синхронизировать доступ к упомянутым счётчикам или использовать для них атомарный класс AtomicInteger из пакета java.util.concurrent.atomic, см. Thread safety for static variables на основном StackOverflow.