#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, специально для моего использования, но это дало мне толчок в этом направлении. Спасибо за идею!