Библиотека Kotlin для нескольких целей JVM

Привет, сообщество StackOverflow!

Я пытаюсь создать библиотеку в Котлине. Я хочу иметь постоянную публичную поверхность API с несколькими реализациями для разных библиотек и общую кодовую базу, которая также должна содержать код Kotlin / JVM. Затем общедоступная поверхность API может использоваться в других проектах, а реализация выбирается во время выполнения (через путь к классам).

Например, предположим, что я хочу написать библиотеку, которую я использую для хранения данных на сервере. Внешний вид поверхности общедоступного API должен иметь метод, подобный приведенному ниже, но он также должен обрабатывать общую бизнес-логику, такую ​​как проверка данных.

fun storeData(data: String) {
   if (data.isNotEmpty()) {
      actuallyStoreData(any)
   } else {
      throw IllegalArgumentException("data cannot be empty");
   }
}

private fun actuallyStoreData(data: String) // this method should depend on the implementation

Затем я хочу реализовать эту библиотеку для двух разных баз данных: скажем, MongoDB и MySQL. Поэтому в моем проекте, который использует эту библиотеку, я обращаюсь только к общедоступному API. Когда проект запускается, реализация этой функции должна зависеть от того, находится ли my-library-mysql.jar или my-library-mongodb.jar в пути к классам.

Может быть, это странный вопрос, и я, вероятно, думаю, что это слишком сложно, но это действительно облегчило бы разработку моего проекта. Я пробовал Kotlin Multiplatform, но он не дает возможности указать общую цель JVM. Итак, есть ли способ реализовать это?


person theincxption    schedule 12.12.2020    source источник


Ответы (1)


IMO, если вы ориентируетесь только на JVM, вам может быть лучше абстрагироваться от функциональности в интерфейсе.

Механизм expect/actual в Kotlin Multiplatform больше предназначен для абстрагирования реализаций от разных целей (JVM, Native, JS).

person Róbert Nagy    schedule 12.12.2020
comment
Да, использование интерфейсов с несколькими реализациями (например, через внедрение зависимостей) очень распространено для такого рода вещей. Сам JDBC имеет гораздо больше открытых интерфейсов, чем классов. - person gidds; 13.12.2020