Проверьте, присутствует ли хотя бы 1 из набора аргументов в конструкторе класса Kotlin

#validation #kotlin #constructor

#проверка #kotlin #конструктор

Вопрос:

Сценарий

Мне нужно создать класс Kotlin, который может получать до 4 аргументов для своего конструктора, но требует только по крайней мере 1 из набора из 3 (четвертый является полностью необязательным). Для иллюстрации:

 class Pie {

// Completely optional, the constructor should use it if present, otherwise it may be null.
    var topping: String?   

// Of these three [fillingA, fillingB, fillingC] 1 or more must be present.
    var fillingA: String?   
    var fillingB: String?  
    var fillingC: String?
}
  

Мысли

Я пытался использовать для проверки блоки Kotlin init{} или телескопические конструкторы, но это становится ужасно быстрым, и мне еще предстоит решить проблему. Я ничего не нашел в kotlinlang.org документы по основным / вторичным конструкторам, которые, тем не менее, более элегантны. Я бы предпочел найти что-то похожее на аннотации @Size или @NotNull , но мне не удалось найти ничего близкого.

Важно отметить, что я использую этот класс в качестве модели для ответа API.

Вопрос

Какой самый краткий способ проверить, что класс Kotlin имеет хотя бы 1 из набора аргументов, переданных его конструктору?

Комментарии:

1. Может быть, объединить заполнения в массив или карту? Таким образом, вы можете просто проверить, не пусто ли оно.

2. Вам нужно проверять во время компиляции?

3. Поскольку я сопоставляю с ним ответ API, нет. Хороший вопрос @Tenfour04

4. Я не уверен, что понимаю вашу идею, @Pawel. Не могли бы вы опубликовать пример? Вы имеете в виду получить массив или использовать блок инициализации для агрегирования, а затем проверить размер?

5. Проблема здесь в том, что «Pie» явно является аналогией для класса, который вы пытаетесь реализовать, что затрудняет для нас предложение альтернативных предложений. Например, если вам действительно нужен pie, я бы предложил сделать начинки списком и просто генерировать исключения, если список равен < 1 или> 3 при инициализации. Однако я не уверен, соответствует ли это вашему варианту использования.

Ответ №1:

Являются ли эти заполнения взаимозаменяемыми? Можно предположить, что заполнение всегда обязательно, а остальные необязательны, что-то вроде этого:

 class Pie constructor(
    val fillingA: String,
    val fillingB: String? = null,
    val fillingC: String? = null,
    val topping: String? = null
){...}
  

Комментарии:

1. Это умно, и, кроме идеи @ Pawel выше, это единственный способ, который я могу в настоящее время найти для решения сценария в случае, который я представил выше. На самом деле я думаю, что мог бы оставить каждый из параметров обнуляемым и записать проверку в mapper, который отвечает на вызов api, специально для моего использования, но это дало мне толчок в этом направлении. Спасибо за идею!