Comments 5
В статье описан паттерн Java, на котлин никто так не делает, так как dsl выигрывает и в читабельности и в поддерживаемости, посмотрите как kotlin gradle dsl отлично подошел для написания скриптов.
Kotlin билдер выглядит так:
val onlyAudio = MediaRecorder {
audioSource = AudioSource.MIC
audioEncoder = AudioEncoder.AAC
path = "PATH"
outputFormat = OutputFormat.AAC
}
Но ведь с DSL мы вернемся к тому, что audioSource и videoSource будут лежать внутри MediaRecorder, тогда можно будет написать и так:
val onlyAudio = MediaRecorder {
audioSource = AudioSource.MIC
videoSource = VideoSource.CAMERA
audioEncoder = AudioEncoder.AAC
path = "PATH"
outputFormat = OutputFormat.AAC
}
А ведь мне нужно сделать так, чтобы при указании audioSource, параметр videoSource уже нельзя было выставить.
Или, подскажите более детально, что Вы имеете ввиду.
Используйте типы. Введите интерфейс Source (можно даже sealed), от него наследуйте и VideoSource, и AudioSource. MediaRecorder (и его билдер) типизируйте с <T : Source>
ну и в нём одно поле val source: T
.
лучше всего изолировать разные варианты на верхнем уровне, если нужно onlyAudio то создать AudioRecorder билдер который вернет MediaRecorder но с уже заданным VideoSource.NONE для MediaRecorder
Конкретно в Вашем примере можно сделать audio и video отдельными сущностями (возможно, с отдельными билдерами для каждой).
Будет MediaRecorder(VideoRecoder?, AudioRecorder?, outputFormat)
Можно вместо билдера сделать три вспомогательные функции, которые принимают либо только видео, либо только аудио, либо видео+аудио.
Но в целом подход с цепочкой вызовов интересный.
Builder на Kotlin c контролем наборов значений при компиляции