Я использую неявные классы Scala для расширения объектов, с которыми я часто работаю. Как пример, у меня есть метод, подобный этому, определенный на Spark DataFrame
:
implicit class DataFrameExtensions(df: DataFrame) {
def deduplicate: Boolean =
df.groupBy(df.columns.map(col): _*).count
}
Но неявные определения не вызываются, если класс уже определяет тот же метод. Что произойдет, если я позже обновлюсь до новой версии Spark, которая определяет метод DataFrame#deduplicate
? Клиентский код автоматически переключится на новую реализацию, что может привести к незначительным ошибкам (или очевидным, которые менее проблематичны).
Используя отражение, я могу выдать ошибку runtime , если DataFrame
уже определяет deduplicate
до того, как мой неявный определяет это. Теоретически, если мой неявный метод конфликтует с существующим, я могу обнаружить его и переименовать в неявную версию. Однако после обновления Spark, запуска приложения и обнаружения проблемы уже слишком поздно использовать IDE для переименования старого метода, поскольку любые ссылки на df.deduplicate
теперь ссылаются на собственную версию Spark. Мне пришлось бы вернуться к моей версии Spark, переименовать метод через IDE, а затем снова обновить. Не конец света, но не отличный рабочий процесс.
Есть ли лучший способ справиться с этим сценарием? Как можно безопасно использовать шаблон «pimp my library»?