Статическая переменная, которая может увеличиваться и уменьшаться

Как создать у класса статическую переменную count, которая увеличивается на 1, если кошку создали, и убывает на 1, если кошка взорвалась или умерла.

public class Cat {

    private double originWeight;
    private double weight;

    private double minWeight;
    private double maxWeight;
    public static int count = 0;


    public Cat() {
        weight = 1500.0 + 3000.0 * Math.random();
        originWeight = weight;
        minWeight = 1000.0;
        maxWeight = 9000.0;
        count++;
    }
    public static int getCount(){
        return count;
    }
    public void meow() {
        weight = weight - 1;
        System.out.println("Meow");
    }

    public void feed(Double amount) {
        weight = weight + amount;
    }

    public void drink(Double amount) {
        weight = weight + amount;
    }

    public double getWeight() {
        return weight;
    }

    public String getStatus() {
        if (weight < minWeight) {
            return "Dead";
        } else if (weight > maxWeight) {
            return "Exploded";
        } else if (weight > originWeight) {
            return "Sleeping";
        } else {
            return "Playing";
        }
    }
}

На данный момент получается только создать кошку, чтоб изменилась переменная на нужную цифру. Если кошка умирает, то всё равно показывается цифра 4.

public class Loader
{
    public static void main(String[] args)
    {
        Cat murka = new Cat();
        Cat vasya = new Cat();
        Cat rings = new Cat();
        Cat masha = new Cat();
        System.out.println(Cat.getCount());
        while (murka.getWeight() > 1000)
            murka.meow();
        System.out.println("Masha weight:" + murka.getWeight() + murka.getStatus());
        System.out.println(Cat.getCount());
    }
]

Ответы (3 шт):

Автор решения: Sergey

Что-то не видно, чтобы Вы пытались уменьшать счётчик кошек.
Судя по всему, должен быть такой метод:

private void setWeight(double weight) {
    this.weight = weight;
    if (weight < minWeight || maxWeight < weight) {
        count--;
    }
}

и изменять weight только вызовом этого метода:

public void meow() {
    setWeight(getWeight() - 1);
    System.out.println("Meow");
}
→ Ссылка
Автор решения: Дмитрий

Это скучно, давайте сделаем что-то, что хотя бы отдаленно напоминающее ООП, а заодно и вашу проблему решим:

import java.util.ArrayList;
import java.util.List;

public class Loader {

    public static void main(String[] args) {
        List<Animal> animals = new ArrayList<>();
        animals.add(Animal.of("Murka"));
        animals.add(Animal.of("Vasya"));
        animals.add(Animal.of("Rings"));
        animals.add(Animal.of("Masha"));
        System.out.println("Cats count : " + Cat.getCount());
        AnimalService service = new AnimalService();
        service.print(animals);
        System.out.println("*************************************************");
        service.voiceAll(animals);
        service.drinkAll(animals, 1000);
        service.feedAll(animals, 5000);
        System.out.println("*************************************************");
        service.print(animals);
        System.out.println("*************************************************");        
        service.print(animals);
        service.voiceAll(animals);
        System.out.println("*************************************************");        
        System.out.println("Cats count : " + Cat.getCount());
        System.out.println("*************************************************"); 
        List aliveAnimals = service.filterAlive(animals);
        System.out.println("Steel alive : ");
        service.print(aliveAnimals);
        
    }
    
}

public interface Animal {

    void drink(int amount);

    void feed(int amount);
    
    String voice();

    String getName();

    Status getStatus();

    int getWeight();
    
    public static Animal of(String name){
        return new Cat(name);
    }
    
}


import static animals.Status.*;

public class Cat implements Animal {
    
    private final static String VOICE = "Meow";
    private final static int MIN_WEIGHT = 1000;
    private final static int MAX_WEIGHT = 9000;
    
    private static int count = 0;
    
    private final String name;
    private final int originWeight;
    private int weight;
    private Status status;
    
    public Cat(String name) {
        this.name = name;
        weight = (int) (1500 + 3000 * Math.random());
        originWeight = weight;
        status = checkStatus();
        count++;
    }

    public static int getCount() {
        return count;
    }

    @Override
    public String voice() {
        weight--;
        return isAlive() ? VOICE : "";
    }

    @Override
    public void feed(int amount) {
        if (isAlive()) weight += amount;
    }

    @Override
    public void drink(int amount) {
        if (isAlive()) weight += amount;
    }
    
    @Override
    public int getWeight() {
        return weight;
    }
    
    @Override
    public Status getStatus() {
        return status;
    }

    @Override
    public String getName() {
        return name;
    }
    
    private boolean isAlive(){
        if (!status.isAlive()) return false;
        this.status = checkStatus();
        if (status.isAlive()) return true;
        else {
            count--;
            return false;            
        }
    }
    
    private Status checkStatus() {
        if (weight < MIN_WEIGHT) return DEAD;
        if (weight > MAX_WEIGHT) return EXPLODED;
        
        if (weight > originWeight) return SLEEPING;
        return PLAYING;
    }

    @Override
    public String toString() {
        return "Cat{" + "name=" + name + ", weight=" + weight + ", status=" + status + '}';
    }
    
}

public enum Status {
    
    PLAYING("Playing", true), 
    SLEEPING("Sleeping", true), 
    EXPLODED("Exploded", false), 
    DEAD("Dead", false);
    
    private final String name;
    private final boolean alive;

    private Status(String name, boolean alive) {
        this.name = name;
        this.alive = alive;
    }
    
    public boolean isAlive(){
        return alive;
    }

    @Override
    public String toString() {
        return name;
    }
    
}
→ Ссылка
Автор решения: Ramiz

вот форк Вашего кода с минимальными правками и комментариями. суть правки - обновление статуса во всех мутаторах (методах изменяющих состояние).

public class Cat {

    private double originWeight;
    private double weight;

    private double minWeight;
    private double maxWeight;

    // 1) добавим статус. можно конечно и enum, но не обязательно, т.к. статус приватный
    private String status;

    public static int count = 0;

    public Cat() {
        weight = 1500.0 + 3000.0 * Math.random();
        originWeight = weight;
        minWeight = 1000.0;
        maxWeight = 9000.0;
        count++;
        status = "New"; // необязательно, но можно проинциализировать, для красоты
    }
    public static int getCount(){
        return count;
    }
    public void meow() {
        weight = weight - 1;
        updateStatus(); // 2) обновляем статус в каждом мутаторе (методе изменяющем состояние), т.к. он потенциально может привести к изменению статуса
        System.out.println("Meow");
    }

    public void feed(Double amount) {
        weight = weight + amount;
        updateStatus(); // см 2)
    }

    public void drink(Double amount) {
        weight = weight + amount;
        updateStatus(); // см 2)
    }

    public double getWeight() {
        return weight;
    }

    public String getStatus() {
        return status;
    }

    // 3) проверка статуса на изменение
    void updateStatus() {
        if (weight < minWeight) {
            status = "Dead";
            count--; // теоретически это можно вынести в отдельный метод, но только если программа будет эволюционировать, а пока можно и так
        } else if (weight > maxWeight) {
            status = "Exploded";
            count--;
        } else if (weight > originWeight) {
            status = "Sleeping";
        } else {
            status = "Playing";
        }
    }

}
→ Ссылка