Вы можете импортировать сеттеры, чтобы вам не нужно было квалифицировать вызовы:
val product = {
val p = new Product
import p._
setName("Cute Umbrella")
setSku("SXO-2")
setQuantity(5)
p
}
Если Product
не является окончательным, вы также можете анонимно создать его подкласс и вызвать сеттеры в конструкторе:
val product = new Product {
setName("Cute Umbrella")
setSku("SXO-2")
setQuantity(5)
}
Как только вы пытаетесь создать экземпляр с помощью карты имен и значений свойств, вы теряете статическую проверку типов, поскольку прибегаете к отражению. Такие библиотеки, как Apache Commons BeanUtils, могут помочь, если вы все еще хотите пойти по этому пути.
Еще один подход состоит в том, чтобы передать последовательность анонимных функций для вызова каждого сеттера и написать служебный метод, чтобы применить их к объекту
def initializing[A](a: A)(fs: (A => Unit)*) = { fs.foreach(_(a)); a }
initializing(new Product)(
_.setName("Cute Umbrella"),
_.setSku("SXO-2"),
_.setQuantity(5)
)