Почему eGet в EMF возвращает Object, а не EObject?

Я работаю над некоторым кодом, используя структуру EMF на Java, но ее действительно сложно использовать, например. Я не могу реализовать OCL-подобный API запросов поверх EMF, который был бы типобезопасен.

Одна из причин заключается в том, что eGet() вместо EStructuralFeature возвращает только Object, а не EObject. Таким образом, все, что я буду писать, должно использовать большую часть проверки нулей, проверки типов и приведения типов, что небезопасно, неэффективно и не может быть обобщено повторно используемым способом.

Почему EMF не создает фиктивные реализации с EObject обертками для произвольного значения Object?

Внедрение EObject и, следовательно, EClass интерфейсов даже с помощью простого throw UnsupportedOperationException действительно проблематично (API слишком велики). То же самое относится и к методу eContainer(), который делает навигацию по модели вверх болезненной.


person Gabriel Ščerbák    schedule 29.03.2010    source источник
comment
Я только что понял, что в EMF есть оболочки для примитивных типов Java и их эквивалентов объектов, но вопрос все еще остается, зачем API, который возвращает объекты?   -  person Gabriel Ščerbák    schedule 29.03.2010


Ответы (2)


Тот же метод используется для доступа к простым значениям атрибутов (которые могут относиться к любому типу Java) и взаимосвязям перехода к другим смоделированным объектам, которые могут быть однозначными или многозначными.

EMF предоставляет общие механизмы для проверки того, является ли объект экземпляром EClass или может ли EClass присваиваться другому, поэтому я не вижу в этом проблемы.

person user48945    schedule 30.03.2010
comment
Кстати, нет лучшего места, чтобы задать этот вопрос, чем группа новостей EMF: eclipse.org/forums/index.php?t=thread&frm_id=108 - person user48945; 30.03.2010
comment
Тем не менее, мое первое впечатление - это ничем не отличается от Java с примитивными типами и без автоупаковки. Я немного подумаю и запрограммирую, чтобы составить какое-то разумное мнение. - person Gabriel Ščerbák; 01.04.2010

Метод eGet() является частью рефлексивного API EMF. Поскольку EMF может обернуть любой сериализуемый объект, вы не можете ограничить возвращаемый объект такого рефлексивного API.

Почему вам нужно использовать этот отражающий API вместо сгенерированной Java-реализации вашей модели ecore? Таким образом, у вас будет весь прямой хорошо типизированный API для управления объектами домена.

person greydet    schedule 11.05.2011
comment
Я использую Eclipse Xtext и не могу определить произвольные элементы модели в грамматике (например, типизированную родительскую ассоциацию). Когда я пишу некоторые сервисы в Xtext (код Java), мне нужно пройти через модель, но без реальных ассоциаций, я должен использовать отражающий API и довольно много приводить. eGet, возвращающий Object, не позволит мне написать хороший общий код, чтобы справиться с этим для меня. - person Gabriel Ščerbák; 12.05.2011