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