Программа должна выводить несколько void методов. Как сделать так, чтобы при каждом выводе эта строчка получала номер? Я понимаю, что надо использовать цикл, но не пойму как именно его использовать.
Код:
public class Parrot extends Pet {
private int age;
public Parrot(int size, String name, int age ) {
super(size, name);
this.age = age;
}
void eat() {
}
void fly () {
System.out.println("It can fly very high");
}
void getWordsPerDay (int words) {
System.out.println("It can pronounce " + words + " words per day");
}
}
Как сделать так, чтобы заданные методы каждый раз при вызове получали порядковый номер?
Например, если вызываются методы eat(), eat(), fly(), eat(), fly(), то выводится 1, 2, 3, 4, 5.
Прямолинейный подход: создать метод, который увеличивает и выводит значение счетчика и вызывать его в каждом из методов:
public class Parrot extends Pet {
/**
* Счетчик
*/
private int callCounter = 0;
/**
* Увеличивает и выводит счетчик
*/
private void countCall() {
callCounter++;
System.out.println(callCounter);
}
void eat() {
countCall();
...
}
void fly() {
countCall();
...
}
Если нужно, чтобы счетчик был общим для разных объектов Parrot, то callCounter и countCall нужно будет объявить как static.
Этот способ требует изменения кода всех методов, по которым нужно считать вызовы. Если по каким-то причинам нужно считать вызовы не изменяя кода, то задача усложняется. Есть следующие варианты:
если хочешь поставить счетчик вызова каждого метода, то можно сделать так:
public class Parrot extends Pet {
private int age;
private int countFly = 0;
private int countgetWordsPerDay = 0;
public Parrot(int size, String name, int age ) {
super(size, name);
this.age = age;
}
void eat() {
}
void fly () {
countFly = countFly + 1;
System.out.println(countFly + ")" + "It can fly very high");
}
void getWordsPerDay (int words) {
System.out.println(countgetWordsPerDay + ")" + "It can pronounce " + words + " words per day");
}
}
Чтобы сделать то, что вы хотите достаточно завести статическую переменную и обращаться к ней каждый раз при вызове метода. Но здесь есть один нюанс, если методы вызываются из разных потоков, нужно объявить ее соответствующим потокобезопасным примитивом:
private static final AtomicLong atomicCounter = new AtomicLong(0);
либо обернуть в java.lang.ThreadLocal:
private static final ThreadLocal<Long> threadLocalCounter = new ThreadLocal<>();
Тела методов будут выглядеть соотвественно так:
public void firstMethod() {
System.out.println(atomicCounter.getAndIncrement());
}
либо:
public void firstMethod() {
long value = threadLocalCounter.get();
System.out.println(value);
threadLocalCounter.set(value + 1);
}
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости