У меня есть 2 разных предложения:
1) Создайте тест junit, который обнаруживает все подклассы вашего базового класса, а затем выбирает все методы, украшенные аннотациями @Override. У меня есть несколько модульных тестов, которые делают что-то похожее (например, найти все подклассы, проверьте, что они действительно , например, Serializable).
К сожалению, проверка того, называют ли они «супер», немного проще. Вам нужно было бы либо чтобы тест проверял исходный файл и искал его, либо лучше (но я не знаю, как это сделать), читал байт-код и проверял, можете ли вы обнаружить вызов super.
2) Необходимость гарантировать вызов super , вероятно, является индикатором проблемы дизайна / интерфейса, а не проблемы кодирования / реализации. Если вы действительно хотите гарантировать, что пользователи будут вызывать super, было бы лучше сделать суперкласс abstract , четко обозначить абстрактный метод реализации, которым они должны переопределить, и иметь супер контроль потока выполнения. 1013 *
Если вы хотите определить реализацию по умолчанию, так что не всем пользователям нужно, чтобы подкласс предоставлял реализацию этого метода, вы можете определить класс реализации по умолчанию для использования людьми. (И если вы действительно хотите управлять им, определите этот метод реализации класса по умолчанию как final , чтобы заставить их вернуться к созданию подкласса абстрактного родителя.)
С наследованием повторного использования кода всегда сложнее управлять, и поэтому его нужно делать осторожно. Любой, кто делает наследование повторного использования кода, должен иметь хорошее представление о внутренностях суперкласса, чтобы сделать это правильно (что немного отвратительно). Например, вам нужно вызывать super.method () в начале вашего переопределенного кода или в конце? (или вы могли бы сделать это в середине ...)
Итак, в общем, лучшее решение - это попытаться избежать дизайна, в котором вы должны применять его.