Szukaj…


Składnia

  • class Meter (val metres: Double) rozszerza AnyVal
  • typ Meter = Double

Uwagi

Zaleca się stosowanie klas wartości dla jednostek lub dedykowanej biblioteki dla nich.

Wpisz aliasy

type Meter = Double

To proste podejście ma poważne wady w obsłudze jednostek, ponieważ każdy inny typ, który jest Double będzie z nim kompatybilny:

type Second = Double
var length: Meter = 3
val duration: Second = 1
length = duration
length = 0d

Wszystkie powyższe kompilują, więc w tym przypadku jednostki mogą być używane tylko do oznaczania typów wejść / wyjść dla czytników kodu (tylko intencja).

Klasy wartości

case class Meter(meters: Double) extends AnyVal
case class Gram(grams: Double) extends AnyVal

Klasy wartości zapewniają bezpieczny dla typu sposób kodowania jednostek, nawet jeśli wymagają nieco więcej znaków do ich użycia:

var length = Meter(3)
var weight = Gram(4)
//length = weight //type mismatch; found : Gram required: Meter

Po rozszerzeniu AnyVal nie ma kary wykonawczej za ich użycie, na poziomie JVM są to regularne typy pierwotne (w tym przypadku Double s).

Jeśli chcesz automatycznie generować inne jednostki (takie jak Velocity vel MeterPerSecond ), to podejście nie jest najlepsze, chociaż istnieją biblioteki, które mogą być również używane w takich przypadkach:



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow