Установщики инкапсуляции Java, не изменяющие переменные экземпляра

#java #encapsulation #setter #instance-variables

#java #инкапсуляция #установщик #переменные экземпляра

Вопрос:

Мой код состоит из 2 классов. (1. Тест) (2. Собака)

Цель кода состоит в том, чтобы test создал 3 собаки и с помощью установщиков установил имя и размер собак, а затем заставил 3 собак лаять.

Вот мой код.

 public class Dog {
private int size;

public void bark(){
    System.out.println("Size: "   size);
    if(size > 19) System.out.println("Woof Woof Woof");
    if(size > 9 amp;amp; size < 20) System.out.println("Bark Bark Bark");
    if(size < 10 amp;amp; size > 0) System.out.println("Yip Yip Yip");
    if(size == 0) System.out.println("Size Not Set");
}

public void setSize (int s){
    if(size > 0 amp;amp; size < 60) size = s;
    if(size > 60) { 
        size = 60; 
        System.out.println("Debug: Size sent to large resetting to max.(60)"); 
    }
}
  

 public class Test{
public static void main (String[] args){

//dog size
int s1 = 100;
int s2 = 100;
int s3 = 100;

//create dog and make him bark
Dog d1 = new Dog();
d1.setSize(s1);
d1.bark();

//create dog and make him bark
Dog d2 = new Dog();
d2.setSize(s2);
d2.bark();

//create dog and make him bark
Dog d3 = new Dog();
d3.setSize(s3);
d3.bark();
}}
  

Вот результат

 Size: 0
Size Not Set
Size: 0
Size Not Set
Size: 0
Size Not Set
  

Я думаю, что при Dog запуске setSize он не ссылается size на переданный аргумент? Если да, то как мне это исправить?

Когда я переключаюсь private int size; на private int size = 10; это, это работает. Однако, когда я меняю его на private int size = 0; это, это не так.

Почему это так?

Комментарии:

1. почему вы проверяете размер?

2. измените размер> 60; на s> 60

Ответ №1:

ваша логика установки неверна:

  if(size > 0 amp;amp; size < 60) size = s;
    if(size > 60) { 
        size = 60; 
  

по умолчанию размер инициализируется равным нулю, поэтому вызов установщика не работает, потому что это условие никогда не проверяется!

вам нужно проверить параметр s вместо размера поля!

Ответ №2:

Измените свой размер setter на

 public void setSize (int size){
    if(size > 0 amp;amp; size < 60) this.size = size;
    if(size > 60) { 
        this.size = 60; 
        System.out.println("Debug: Size sent to large resetting to max.(60)"); 
    }
}
  

Не было смысла проверять значение size , поскольку оно еще не было установлено

Ответ №3:

изменить size > 60 ; на s>60