Статическая переменная, которая может увеличиваться и уменьшаться
Как создать у класса статическую переменную 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 шт):
Что-то не видно, чтобы Вы пытались уменьшать счётчик кошек.
Судя по всему, должен быть такой метод:
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;
}
}
вот форк Вашего кода с минимальными правками и комментариями. суть правки - обновление статуса во всех мутаторах (методах изменяющих состояние).
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";
}
}
}