Вы получите свойства для любых определенных параметров, и они будут значениями (то есть финалами)
case class User(name: String, group: String)
val user = User("jsmith", "admins")
// access both properties
println("name: %s group: %s".format(user.name, user.group))
Вы также можете получить это поведение с обычными (то есть, не-классами):
// creates two final public properties as well
class User(val name: String, val group: String)
// creates read/write public properties
class User(var name: String, var group: String)
val user = new User("jsmith", "admins")
user.group = "guests"
Классы Case также приносят много других вещей, таких как полезные реализации равенства, hashcode и toString и объект-компаньон с фабричным методом, который устраняет необходимость использования new среди других вещей.
Как видите, класс кейсов не обязателен для достижения того, чего вы хотите, но он быстро доставит вас туда. Что касается побочных эффектов, то определение класса case генерирует некоторый фрагмент кода за кулисами, чтобы дать вам то, что было описано в предыдущем абзаце. Они часто полезны, и я не беспокоюсь о них, но полезно знать о них.