Почему подредакторы в среде редакторов GWT должны быть приватными? - PullRequest
1 голос
/ 15 марта 2012

Я только что попробовал каркас редактора GWT и получил его на небольшом примере. Но мне было интересно, почему подредакторы должны быть частными?

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

// Sub-editors are retrieved from package-protected fields, usually initialized with UiBinder.
// Many Editors have no interesting logic in them
public class PersonEditor extends Dialog implements Editor<Person> {
    Label nameEditor;
    AddressEditor addressEditor;
    ...
}

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

Может кто-нибудь объяснить мне, почему существует такое ограничение? Это делает мой стиль кодирования немного противоречивым. Спасибо!

Ответы [ 2 ]

6 голосов
/ 15 марта 2012

Подобно UiBinder, генератор для EditorDriver генерирует классы рядом с Editor классами.Этим классам нужен доступ к редакторам, чтобы иметь возможность работать с ними.

Иными словами, среда редактора не будет изменять ваши классы ( волшебства нет ), поэтому вам нужно как-топредоставьте доступ вашим подредакторам: достаточно указать package-private, но, конечно, тоже будет работать public.
Лучший способ понять, что происходит, - передать параметр -gen (за которым следует путь к каталогу)GWT-компилятор режима dev, так что он выводит все сгенерированные классы на диск.Однако будьте осторожны: каркас редактора действительно трудно понять!

Кроме того, если ваш редактор расширяет какой-то другой класс в другом пакете, который содержит субредактор (который вы хотите унаследовать), этот субредактор должен быть видимымиз пакета дочернего класса, поэтому он должен быть public в родительском классе или быть явно представленным дочерним классом (используя метод доступа, который не private).

2 голосов
/ 15 марта 2012

GWT генерирует делегат редактора (и контекст) для каждого редактора, который будет использоваться драйвером.Этому делегату (и контексту) требуется доступ к подредакторам, которыми они будут манипулировать как часть передачи данных в редакторы и из них.Поскольку они написаны на Java и не используют JSNI для доступа к закрытым полям, ваши редакторы должны быть доступны для других классов в том же пакете.

Тем не менее, есть несколько вариантов для вас.Первый - сделать их явно public или protected, что может соответствовать или не соответствовать вашему стилю кода.Второй заключается в том, чтобы представить их с помощью методов, при этом метод должен называться так же, как и свойство, подлежащее редактированию, с дополнительным суффиксом «Редактор».Подробнее см. http://code.google.com/webtoolkit/doc/latest/DevGuideUiEditors.html#Editor_contract.

Это ограничение аналогично ограничению uibinder - поле должно быть доступно для чтения / записи из сгенерированных классов.Если у вас просто есть private Label nameEditor;, то ваша IDE, скорее всего, будет жаловаться на вас, что он не используется, так как он не может увидеть не сгенерированный код, который может получить доступ к этим полям.Если сделать его более открытым, чем private, то станет ясно, что он будет использоваться вне этого единственного класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...