Не могу подсчитать количество проданных цветов (используя статическую переменную)

Подсчитать количество проданных цветов (используем статическую переменную).

Вот мой код:

        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 шт):

Автор решения: Nowhere Man

Простой пример статического счётчика экземпляров: в верхнем классе иерархии цветов 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.

→ Ссылка