Является ли переопределение JavaFX TreeItem getChildren хорошей идеей?

#javafx #treeview #overriding

Вопрос:

Моя цель состоит в том, чтобы выполнить процесс во время всех добавлений к дочерним элементам в дереве (точнее, просмотр таблицы).

Это node.getTreeItem().getChildren.add(playlist) вызывается в разных частях моего кода, и я старался как можно больше придерживаться лучших практик… так что давайте все упростим и скажем, что я обязательно позвоню, пока будет сделано перетаскивание, а также при построении дерева.

Мой «плейлист» может быть 3 разных типов (в классе перечисления) :

  • ПАПКА (содержащая другой плейлист)
  • СПИСОК (содержащий треки, добавленные пользователем)
  • ЗАПРОС (содержащий треки в результате запроса)
  • ОШИБКА (никогда не должна быть установлена, но полезна для отладки и т. Д.)

Я хочу реализовать метод на своем «расширенном» TreeItemlt;Playlistgt; , например getPlaylistType() . Этот метод вернет тип списка воспроизведения.

ВОПРОС : Мой инстинкт подсказал бы, что я должен переопределить node.getTreeItem().getChildren.add(playlist) , чтобы установить тип таким образом :

  • Есть детский плейлист —gt; ПАПКА
  • Нет детского плейлиста amp;amp; запрос не существует —gt; ЗАПРОС
  • Нет детского плейлиста amp;amp; запрос не существует —gt; СПИСОК
  • Любое другое состояние —gt; НЕИЗВЕСТНОЕ/ОШИБКА
  1. Является ли этот подход правильным ?
  2. Как переопределить метод » добавить (…)»?

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

1. На данный момент я использую метод в своем TreeItemPlaylist классе: public boolean addToChildren(TreeItemPlaylist playlist) {...} который содержит getChildren.add(playlist) и любую дополнительную обработку, в которой я нуждаюсь. Вероятно, не самый элегантный… Например, это не предотвращает обход моего настроенного процесса после добавления узла при node.getTreeItem().getChildren.add(playlist) использовании.

2. Мой инстинкт сказал бы, что я должен переопределить node.getTreeItem().getChildren.add(плейлист) при всем уважении: не слушайте инстинкт, это неправильно 😉 Кстати: не добавляйте детали к вопросу в комментариях, вместо этого отредактируйте вопрос, чтобы включить их.

Ответ №1:

Почему вы предоставляете node.getTreeItem().getChildren.add(playlist) доступ к различным частям своего программного обеспечения? Если вы просто обернете его в свой собственный класс, вы сможете раскрыть его и делать все, что захотите, при вызове соответствующего add метода.

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

1. Здравствуйте, и спасибо вам за ваш ответ ! У меня действительно есть свой собственный расширенный TreeItemPlaylist extends TreeItemlt;TreeTableRowPlaylistgt; класс… Я не переопределил getChildren() (an ObservableListlt;TreeItemlt;TreeTableRowPlaylistgt;gt; ), и, следовательно, также не add(...) ( java.util.List.add(TreeItemlt;TreeTableRowPlaylistgt; e) ). Должен ли я ? Если да, то как ?

2. вы можете создать метод add(…) в своем «расширенном» классе, выполнить проверку и вызвать getChildren().добавьте(…) оттуда и замените вызовы getChildren().добавьте(…) вызовами метода add(…) в своем расширенном классе, хотя getChildren() по умолчанию по-прежнему будет доступен для разных частей вашего программного обеспечения, как сказал @mipa, вы можете обернуть атрибут TreeItemlt;Список воспроизведенияgt; в свой класс вместо его переопределения и предоставлять только те методы, которые необходимо предоставить.

3. То, что я имел в виду, заключалось в том, чтобы завершить все это и только разоблачить это. Это было бы чище и скрывало бы детали вашей реализации.

4. Итак, если я правильно читаю ваше решение, @mipa, это то, что я предложил в качестве временного решения в своем комментарии к вопросу. Да? Все еще чувствует себя неловко из-за того, что getChildren.add(playlist)