Friday, September 23, 2016

Create Custom Values (AnyVal) : Example...

scala> // Recommended / Best practice : Try to create domain

scala> //    specific types in order to avoid type

scala> //    monoculture #255

scala>

scala> ///////////////////////////////////////////

scala> // A method call using Basic Value Classes

scala> //////////////////////////////////////////

scala> def divide(numerator: Int, denominator: Int) : Int = {
     |   numerator / denominator
     | }
divide: (numerator: Int, denominator: Int)Int

scala>

scala> divide(10, 5)
res58: Int = 2

scala> divide(5, 10)
res59: Int = 0

scala>

scala> ///////////////////////////////////////////

scala> // A method call using Custom Value Classes

scala> //////////////////////////////////////////

scala>

scala> class Numerator(val num:Int) extends AnyVal
defined class Numerator

scala> class Denominator(val num:Int) extends AnyVal
defined class Denominator

scala>

scala> def divide(numerator: Numerator, denominator:Denominator) = {
     |   numerator.num / denominator.num
     | }
divide: (numerator: Numerator, denominator: Denominator)Int

scala>

scala> divide(new Numerator(10), new Denominator(5))
res60: Int = 2

scala> divide(new Denominator(10), new Numerator(5))
<console>:46: error: type mismatch;
 found   : Denominator
 required: Numerator
              divide(new Denominator(10), new Numerator(5))
                     ^