Воспользуйтесь созданными геттерами и сеттерами в игре! рамки

Играть! framework генерирует методы получения и установки для каждого общедоступного поля класса модели во время выполнения.

public class Product {

    public String name;
    public Integer price;
}

будет преобразован в

public class Product {

    public String name;
    public Integer price;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getPrice() {
        return price;
    }

    public void setPrice(Integer price) {
        this.price = price;
    }
}

В руководстве объясняется далее:

Затем, когда вы хотите получить доступ к свойству, вы можете просто написать:

product.name = "My product";
product.price = 58;

Что переводится во время загрузки на:

product.setName("My product");
product.setPrice(58);

... и предупреждает:

Вы не можете напрямую использовать методы получения и установки для доступа к свойствам, если полагаетесь на автоматическую генерацию. Эти методы создаются во время выполнения. Поэтому, если вы ссылаетесь на них в написанном вами коде, компилятор не найдет методы и выдаст ошибку.

Поскольку я не могу использовать эти геттеры и сеттеры вне Play! проекта, я не вижу пользы в их создании. В чем преимущество по сравнению с общедоступными полями, рефакторинг (инкапсуляция поля и изменение вызывающих) всех современных IDE во внимание?


person deamon    schedule 27.09.2011    source источник


Ответы (3)


Краткий ответ: они нужны бобам.

Дольше: спецификация Beans требует (среди прочего) геттера / сеттера для каждого внутреннего поля. Я не уверен на 100%, но предполагаю, что шаблоны Hibernate и Groovy ожидают Java Beans (POJO Beans, а не Java EE!), Поэтому они будут запрашивать геттеры / сеттеры. Игра просто экономит ваше время, поэтому вам не нужно беспокоиться о стандартном коде (если вы по какой-то причине не хотите определять свой собственный геттер / сеттер, что вы можете сделать).

person Pere Villega    schedule 27.09.2011
comment
+1 хороший ответ. Я подробно остановился на определении ваших собственных сеттеров и получателей, поскольку считаю, что это действительно важный момент. - person Codemwnci; 27.09.2011

Другая причина ,, в том, что, хотя вам не нужно указывать сеттеры и геттеры, вы все равно можете!

Итак, если у вас есть (в вашем примере)

product.name = "my product"

Это нормально и делает ваш код более быстрым и, на мой взгляд, более читаемым. Однако есть веская причина для инкапсуляции сеттеров и геттеров. Если вы хотите добавить некоторую логику при изменении вашего product.name, вы можете указать свой собственный сеттер, но вам не нужно изменять приведенный выше код, так как он будет продолжать вызывать сеттер за кулисами.

Таким образом, это дает вам гибкость и мощность хорошей инкапсуляции, но при этом аккуратность и удобочитаемость прямого доступа к полю.

Я считаю, что это лучшее из обоих миров.

person Codemwnci    schedule 27.09.2011
comment
Но поскольку свойства доступны только в пределах одной Play! проект, я мог бы легко использовать рефакторинг из моей IDE. - person deamon; 28.09.2011
comment
да, но тогда вы теряете читаемость. Что мне действительно помогает, так это в шаблонах. - person Codemwnci; 28.09.2011

Если у вас есть частный метод получения / установки, это не сработает, поскольку невозможно создать общедоступный метод получения / установки с таким же именем. Так что он не сработает во время выполнения!

person Shehan Simen    schedule 10.12.2014