Чтение и запись полей объекта - PullRequest
0 голосов
/ 23 октября 2019

Представьте себе эти классы отдельно. Просто ради моего вопроса я поместил эти два класса в один класс. Но вопрос в том, что оба метода одинаковы. Зачем использовать код в Примере1 вместо кода в Примере2 или наоборот?

package Example1;

public class Swan
{

    int numberEggs;

    public static void main(String[] args)
    {
        Swan mother = new Swan();

        mother.numberEggs = 1;

        System.out.println(mother.numberEggs);

    }
}

По сравнению с:

package Example2;

public class Swan
{

    static int numberEggs = 1;

    public static void main(String[] args)
    {

        System.out.println(numberEggs);

    }
}

Ответы [ 2 ]

0 голосов
/ 23 октября 2019

Пример 1 это хорошо. Пример 2 это зло. Почему? Здесь - ссылка из официальной документации. Таким образом, переменные static предназначены для случаев, когда переменная не зависит от ее объекта.

Если вы когда-либо работали с javax.swing.JFrame, вы, вероятно, использовали метод JFrame.setDefaultCloseOperation(int), где вы можете использовать JFrame.EXIT_ON_CLOSE, который идеально подходит для читабельности кода. Эта переменная должна быть независимой от своего объекта.

Однако для примера, подобного вашим птицам, им не нужна статическая переменная. «Но удобнее просто увеличивать его вместо геттеров и сеттеров!»Ну, это плохо.

Например, если все лебеди откладывали ровно 1 яйцо, то для этого вы должны сделать переменную static, вероятно: numberOfEggs = 1 как вы описали. Посмотрите на комментарий @ VGR.

class Example1 {
    int eggs = 0;
    public void layEgg(){
        this.eggs++; // increases the eggs value for this object;
    }
}
class Example2 {
    static int eggs;
    public void layEgg(){
        eggs++;
    }
}
import package.Example1;
class foo {
    public static void main(String[] args){
        Example1 A = new Example1();
        Example2 B = new Example2();
        A.layEgg(); // Increases the value of eggs for this object
        B.layEgg();
        System.out.println(A.eggs);
        System.out.println(B.eggs); // Why is eggs static if it is called this way?
        System.out.println(Example2.eggs); // Okay, but the variable is meant to 
        // be different from other Example2 objects. 
        B.layEgg();
        System.out.println(Example2.eggs); // Perfect for final variables
        System.out.println(B.eggs); // Why is eggs static?
    }
}

Вывод:

1
1
1
2
2
0 голосов
/ 23 октября 2019

Я бы предложил вам другой подход. Основной контекст приложения должен быть отделен от контекста домена. Лебедь является доменным объектом. Вам следует подумать о создании основного класса для вашего приложения с помощью метода main.

// Main application context
public class Application {
    public static void main(String[] args) {
        Swan swan = new Swan(1);
        System.out.println(swan.getEggs());
    }
}

// Domain class, should be in domain package
class Swan {
    private final int eggs;

    public Swan(int eggs) {
        this.eggs = eggs;
    }

    public int getEggs() {
        return eggs;
    }
}
...