Zoeken…


Syntaxis

  • klasse Meter (valmeters: dubbel) verlengt AnyVal
  • type Meter = Dubbel

Opmerkingen

Het wordt aanbevolen om waardeklassen voor eenheden te gebruiken of een speciale bibliotheek daarvoor.

Typ aliassen

type Meter = Double

Deze eenvoudige aanpak heeft ernstige nadelen voor de bediening van de unit, omdat elk ander type dat een Double is, ermee compatibel zal zijn:

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

Alle bovenstaande compilaties, dus in dit geval kunnen eenheden alleen worden gebruikt voor het markeren van invoer- / uitvoertypen voor de lezers van de code (alleen de bedoeling).

Waardeklassen

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

Waardeklassen bieden een typeveilige manier om eenheden te coderen, zelfs als ze wat meer tekens nodig hebben om ze te gebruiken:

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

Door AnyVal s uit te breiden, is er geen runtime-boete voor het gebruik ervan, op JVM-niveau, dat zijn reguliere primitieve typen (in dit geval Double s).

Als u automatisch andere eenheden (zoals Velocity aka MeterPerSecond ) wilt genereren, is deze aanpak niet de beste, hoewel er in die gevallen ook bibliotheken kunnen worden gebruikt:



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow