@Menson

Где размещать переменные: класс или метод?

Всем привет! Объясните, пожалуйста, такой нюанс: где объявлять переменные?!
// Пример 1:
class Cat1 {
	int ht;

	public void setSize(final int size) {
		if (size > 9) {
			ht = size;
			System.out.println("Размер кошки " + ht);
		} else {
			System.out.print("не бывает таких кошек");
		}
	}
}

// Пример 2:
class Cat2 {

	int ht = 0;

	public void setSize(final int size) {
		if (size > 9) {
			ht = size;
			System.out.println("Размер кошки " + ht);
		} else {
			System.out.print("не бывает таких кошек");
		}
	}
}

// Пример 3:
class Cat3 {
	public void setSize(final int size) {
		int ht;
		if (size > 9) {
			ht = size;
			System.out.println("Размер кошки " + ht);
		} else {
			System.out.print("не бывает таких кошек");
		}
	}
}

// Пример 4(так уже почему-то нельзя):
class Cat4 {
	public void setSize(final int size) {
		int ht = 0;
		if (size > 9) {
			ht = size;
			System.out.println("Размер кошки " + ht);
		} else {
			System.out.print("не бывает таких кошек");
		}
	}
}

Примеры с 1 по 3 выдают один и тот же результат, независимо от того, где я объявил переменную (присвоил значение);
Пример 4 недопустим по каким-то причинам..
Заранее спасибо за помощь!
  • Вопрос задан
  • 600 просмотров
Решения вопроса 3
compilator
@compilator
Senior Data Engineer
Внутри метода размещаются переменные, которые необходимы и будут использоваться только во время выполнение этого метода. Внутри класса размещаются переменные, которые говорят о состоянии объекта, порожденного из этого класса. И как правило эти переменные делают приватными + создают геттеры и сеттеры для них. В вашем примере, размер кошки говорит о ее "состоянии", поэтому разумно хранить переменную в классе.

public class Cat {
private int size;

public int getSize() {
return size;
}

public void setSize(int size) {
if(size <= 9) throw new IllegalArgumentException("Cat size should be more than 9");
this.size = size;
}
}
Ответ написан
Комментировать
@Quieteroks
php программист
Переменные в методе, на то они и переменные.
Поля класса в классе, на то они и поля.

Вы должны сами делать выбор в пользу того, где и для чего объявлять. Если переменная нужна только для расчета в конкретном методе, зачем делать для нее поле. Если переменная нужна в классе постоянно, то тут и выбор соответствующий.

Почитайте про ООП в целом. Тут Вам поможет понимание инкапсуляции. Все, что не инкапсулируется, может быть объявлено как переменная в области видимости конкретного метода. А уровень доступа к переменной очень хорошо объясняется путем понимания области видимости.
Ответ написан
Комментировать
xez
@xez Куратор тега Java
TL Junior Roo
#1 от #2 отличаются только явной инициализацией переменной во втором случае. В первом - она инициализируется при создании объекта.
#3 и #4 сами по себе вполне корректны, но бессмыслены: ht, я так понимаю - рост кошки. Нет никакого смысла переносить эту переменную внутрь метода. Метода может и не быть, а рост, видимо, быть должен. Кроме того, если бы в классе Cat были еще какие-то методы (например int getHeight() ), то они не имели возможность получить доступ к этой переменной в последних случаях.

Вот еще пример:
public class Cat {
    int height;

    public int getHeight() {
        return height;               //Все ок переменную видно.
    }

    public void setHeight(int height) {
        this.height = height;    //Все ок переменную видно. this.height - эта переменная, обозначенная в классе.
    }

    public void setInternalVar(int var) {
        int internalVar = var;   //Все ок, но переменная скрыта внутри метода
    }
    
    public int getInternalVar() {
        return internalVar;   // !!Не компилируется  - переменная internalVar не определена внутри класса.
    }
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы