LINUX.ORG.RU

Геттер и сеттер, срабатывающий при прямом обращении к полю

 


1

3

Насколько я понимаю ситуацию сеттер и геттер требуется вызывать явно, так как это обычные методы, икапсуляция и все дела. В то же время, например, в питоне можно определить декоратор @property, который позволит к методу обращаться как к полю. Вот нельзя ли в java сделать, так чтобы инструкции вида
b = foo.a;
foo.a = c;
автоматически вызывали геттер и сеттер соответственно

★★★★★

Последнее исправление: pylin (всего исправлений: 1)

Тут уже советовали. Подключи groovy-all-xxx.jar и будет тебе счастье.

anonymous_
()
Ответ на: комментарий от dzidzitop

Весь код не читал, но в этом методе я бы

if (dependencies == null) {
            throw new NullPointerException("dependencies");
        }
перенес бы в метод, который вызывает оный сеттер. Глянь, кстати, Preconditions в guava — удобная штука для этих целей.
for (final String dependency : dependencies) {
            if (dependency == null) {
                throw new NullPointerException("dependencies contains null dependency.");
            }
            final String normalisedDependency = normalisePath(dependency);
            if (normalisedDependency.equals(path)) {
                throw new IllegalArgumentException("Cannot add itself as a dependency.");
            }
        }
        this.dependencies.clear();
        for (final String dependency : dependencies) {
            this.dependencies.add(normalisePath(dependency));
        }
А тут мне не совсем понятно, зачем
this.dependencies.add(normalisePath(dependency));
делать в отдельном цикле, если можно в том же, в котором ты делаешь
if (normalisedDependency.equals(path)) {
                throw new IllegalArgumentException("Cannot add itself as a dependency.");
            }

Но еще раз повторюсь, лучше выкинуть нахрен весь этот ужас повыше, в бизнес логику, и упростить pojo по максимуму. Он ведь не обязан гарантировать, что данные в нем обязательно правильные, он их лишь содержит в себе, а за правильностью данных должен следить тот, кто и добавляет их в pojo.

P.S.

if (normalisedDependency.equals(path)) {
                throw new IllegalArgumentException("Cannot add itself as a dependency.");
            }
Имхо, лучше сделать так:
if (!normalisedDependency.equals(path)) {
    this.dependencies.add(normalisedDependency);
}

f1xmAn ★★★★★
()
Ответ на: комментарий от f1xmAn

Кстати, если не хочешь, чтобы в коллекции были null'ы, то популярным решением является расширение существующей коллекции добавлением проверок где это необходимо. Скажем, иметь «умный» список Dependencies было бы, возможно, удобнее.

f1xmAn ★★★★★
()
Ответ на: комментарий от f1xmAn

Почитай жавакод к функции, подумай. Потом напишешь что это ужас. Ключевые слова - transactionality & incapsulation.

Бины что делают кодеры за деньги/еду видел - их можно мне не предлагать.

dzidzitop ★★
()
Ответ на: комментарий от f1xmAn

перенес бы в метод, который вызывает оный сеттер.

Так делать НЕ нужно. Даже в энтэрпрайзе. Потому что потом эти проверки расползутся по коду в каждом месте со своими индийскими прибамбасами.

dzidzitop ★★
()
Ответ на: комментарий от f1xmAn

Он ведь не обязан гарантировать, что данные в нем обязательно правильные, он их лишь содержит в себе, а за правильностью данных должен следить тот, кто и добавляет их в pojo.

Жавадок на функцию с этим не согласен. Весь код построен на гарантии что там нет того что там иметь не положено.

dzidzitop ★★
()
Ответ на: комментарий от f1xmAn

Скажем, иметь «умный» список Dependencies было бы, возможно, удобнее.

throw new IllegalArgumentException("Cannot add itself as a dependency.");

вот этот кейс нужно было бы костылить передачей ModuleInfo в конструктор коллекции + реализовывать проверку == moduleInfo в многочисленных add/set/merge функциях java.util.Set.

dzidzitop ★★
()
Ответ на: комментарий от f1xmAn

Весь код не читал, но в этом методе я бы «if (dependencies == null)» перенес бы в метод, который вызывает оный сеттер.

Кстати, код, который будет вызывать этот setDependencies пока что не написан - он public и должен использоваться подключаемыми компонентами. Нехорошо доверять состояние об'екта который используется в разных местах сторонним людям.

dzidzitop ★★
()
Ответ на: комментарий от dzidzitop

Так делать НЕ нужно. Даже в энтэрпрайзе. Потому что потом эти проверки расползутся по коду в каждом месте со своими индийскими прибамбасами.

Сделай отдельно примитивный pojo и отдельно - апи которое в него пишет.

anonymous
()
Ответ на: комментарий от anonymous

Я сделал просто pojo который гарантирует определённое своё состояние. Цэ-подобные структуры заврапленые в set/get + пачка helpers (у каждого - свой) не нужны. Это называется «контракт», который у моей поджы есть.

dzidzitop ★★
()

scala или либа с аннотация которую тебе уже посоветовали.

windofchange
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.