Учитывая следующую функцию:Класс значения w/Строковый внутренний тип?
def prefixDr(firstName: String, lastName: String): String =
"Dr. " + firstName + " " + lastName
Допустим, я решил добавить Value Class, чтобы избежать путаницы и фамилии, пример:
scala> prefixDr("Doe", "Jane")
res5: String = Dr. Doe Jane // whoops - should've been in reverse order
class FirstName(val value: String) extends AnyVal
class LastName(val value: String) extends AnyVal
, а затем использовать их:
def prefixDr(firstName: FirstName, lastName: LastName): String =
"Dr. " + firstName.value + " " + lastName.value
Теперь это безопаснее, чем предыдущие:
scala> prefixDr(new FirstName("Jane"), new LastName("Doe"))
res6: String = Dr. Jane Doe
Во-первых, мое понимание мотивации Тип значения заключается в том, чтобы избежать выделения кучи, т.е. хранить значение в стеке, а не кучу; где первое время доступа быстрее, чем последнее.
Однако в описанном выше случае, я использую два String
«S, которые являются подтипами AnyRef
, т.е. java.lang.Object
, которые выделяют в кучу, как я понимаю.
Итак, в приведенном выше примере, то есть с использованием 2 классов значений, в чем преимущество использования их по сравнению с case class
?
Как примечание стороны, я хотел бы добавить, что она стирается при компиляции, так что вы можете оказаться в ситуации, где два метода принимают два разных класса значений, но он не компилируется, так как метод в конечном итоге имеет одну и ту же подпись. –