Проверка времени компиляции при передаче значений функции в Android Kotlin - PullRequest
4 голосов
/ 16 октября 2019

Я беру файл JSON в качестве входных данных для класса и анализирую значения, используя gson через соответствующие классы данных.

Я хочу вызвать функцию, которая принимает значение String в качестве аргумента.

Допустимое значение строки определяется из значений, проанализированных из файла JSON. Могу ли я каким-то образом проверить, что это строковое значение передается функции во время компиляции и выдает ошибку во время компиляции?

Или Если я могу разрешить только определенные значения в аргументе для функции на основе значений изJSON

Подробное объяснение варианта использования:

Я создаю SDK, в котором человек, использующий sdk, вводит json String. JSON стандартизирован и анализируется в моем коде.

{
    "name": "Test",
    "objects": [
        {
            "name": "object1",
            "type": "object1"
         }
      ]
}

Здесь значения имен и другие значения могут различаться в зависимости от ввода, использованного разработчиком, но ключ остается тем же. Но нам нужно вызвать функцию, используя значение в параметре имени объекта.

fun testMethod(objectName:String)

Поэтому разработчик вызывает метод testMethod как testMethod(object1).

Мне нужно проверить параметр object1 на основе json, но есть ли возможность ограничить параметр метода теста только object1 и выдать ошибку во время компиляции, если разработчик вызывает testMethod(obj1)

Сейчас я анализирую JSON и проверяю внутри testMethod()

Ответы [ 2 ]

0 голосов
/ 22 октября 2019

Конечно, это можно сделать, но как-то иначе, что вы описали. Прежде всего, как вы уже упоминали, такое поведение можно сделать легко. Для этого у нас есть Objects.requireNotNull() или Guava.Preconditions(). В то же время вы можете определить свою проверку, но это будет работать только во время выполнения.

Чтобы сделать во время компиляции, вам необходимо создать Anprotation Preprocessor . То же самое, что и в разных библиотеках, и в одной из них может быть Lombok , с их NotNull и Nullable. Аннотации Android просто предоставляют метку и границу для предупреждения IDE, но в их случае они добавляют NotNull проверку и генерируют исключение для каждого использования аннотации во время компиляции.

Это не легкий путь, но это то, что вы ищете.

0 голосов
/ 16 октября 2019

Нет, это невозможно проверить во время компиляции. Это обработка строк, как числовой расчет.

В моем приложении я преобразую строку в JSON и JSON в строку, передавая дескриптор класса. Моя цель - записать строку JSON в текстовый файл для загрузки в базу данных SQLite. Этот код, который я запустил на своем настольном компьютере, а не в Android .

data class calcDescr (  
   ...
)
val calc = CalcDescr(...)

 //    toJson:  internal Kotlin data to JSON
val content = Gson().toJson(calc)   

  //==================
  // Testing validity
  // ================

 //    fromJson: JSON to internal Kotlin data. 
 // It needs pass the class descriptor. Uses *Java* token, but it's *Kotlin*
var testModel = Gson().fromJson(content, CalcDescr::class.java) 
 //    toJson:  internal Kotlin data to JSON again
var contentAgain = Gson().toJson(testModel)
//    shoul be equal!
if (content == contentAgain)  println("***ok***")

В моем файле я записываю переменную content в файл

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...