PragPub 2012-06: Issue #36 by The Pragmatic Bookshelf

PragPub 2012-06: Issue #36 by The Pragmatic Bookshelf

Author:The Pragmatic Bookshelf
Language: eng
Format: epub, mobi
Tags: PragPub—Monthly Magazine
Publisher: The Pragmatic Bookshelf, LLC
Published: 2012-06-01T04:00:00+00:00


def encrypt = Encryptor.encrypt(toString)

}

val customer = new Customer("John", "Doe")

println(customer.encrypt)

//eoD - nhoJ remotsuc rof sliateD

The Stock class would have to do the same.

class Stock(override val name : String) extends Security(name) {

override def toString = "Details for stock " + name

def encrypt = Encryptor.encrypt(toString)

}

val stock = new Stock("XYZ")

println(stock.encrypt)

//ZYX kcots rof sliateD

The core logic for encrypt is encapsulated, but there’s a thin layer of duplication in the classes that use it. Let’s see how traits solve this problem.

Scala does not have interfaces; instead, it has traits. A Scala trait with only method declarations and no implementation translates to a mere interface at the bytecode level.

Let’s create a trait called Encrypt.

trait Encrypt {

def encrypt : String

}

Compile this trait using scalac and then view the generated bytecode using javap.

> scalac Encrypt.scala

> javap Encrypt

Compiled from "Encrypt.scala"

public interface Encrypt{

public abstract java.lang.String encrypt();

}

Scala traits directly map to Java interfaces. If we place implementations in the trait, then the Scala compiler creates an interface and an abstract base class for us. Let’s implement the encrypt method in our trait.

trait Encrypt {

def encrypt = {

// some complex logic to encrypt the data

toString.reverse

}

}

Compile this modified version of the Encrypt trait and take a look at the bytecode generated.

> scalac Encrypt.scala

> javap Encrypt

Compiled from "Encrypt.scala"

public interface Encrypt extends scala.ScalaObject{

public abstract java.lang.String encrypt();

}

> javap Encrypt\$class

Compiled from "Encrypt.scala"

public abstract class Encrypt$class extends java.lang.Object{

public static java.lang.String encrypt(Encrypt);

public static void $init$(Encrypt);

}

You probably have a hunch where this is going. Rather than requiring us to create the delegation, the Scala compiler takes care of it for us.

Let’s see how we can use this with the Customer class.

class Customer(val firstName : String, lastName : String) extends Encrypt {

//...

override def toString =

"Details for customer " + firstName + " - " + lastName

}

val customer = new Customer("John", "Doe")

println(customer.encrypt)

//eoD - nhoJ remotsuc rof sliateD

We extended the Customer class from the Encrypt trait in much the same way we would have extended from an abstract base class. The encrypt is now automatically part of Customer instances.

Since Stock already extends from Security, Scala allows us to bring the methods of the trait into the Stock class using a special with keyword.

class Stock(override val name : String) extends Security(name) with Encrypt {

override def toString = "Details for stock " + name

}

val stock = new Stock("XYZ")

println(stock.encrypt)

//ZYX kcots rof sliateD

Now all instances of Stock also have the encrypt method. If we take a look at the bytecode generated for the Customer and Stock classes using the javap -c command, we will see the encrypt method added to each of these classes during compile time.

We can bring multiple traits into a class at the same time simply by using multiple withs in the class definition. In the next article in this series we’ll see how we can force method collisions between multiple traits and use it to our advantage.

Scala allows us to apply traits to instances also. Let’s look at a CheckingAccount that does not have the traits.

class CheckingAccount(val number : Int) {

override def toString = "Details for account " + number

}

val anAccount = new CheckingAccount(1)

println(anAccount.encrypt)



Download



Copyright Disclaimer:
This site does not store any files on its server. We only index and link to content provided by other sites. Please contact the content providers to delete copyright contents if any and email us, we'll remove relevant links or contents immediately.
Popular ebooks
Whisky: Malt Whiskies of Scotland (Collins Little Books) by dominic roskrow(74005)
What's Done in Darkness by Kayla Perrin(27012)
The Ultimate Python Exercise Book: 700 Practical Exercises for Beginners with Quiz Questions by Copy(20911)
De Souza H. Master the Age of Artificial Intelligences. The Basic Guide...2024 by Unknown(20669)
D:\Jan\FTP\HOL\Work\Alien Breed - Tower Assault CD32 Alien Breed II - The Horror Continues Manual 1.jpg by PDFCreator(20561)
The Fifty Shades Trilogy & Grey by E L James(19517)
Shot Through the Heart: DI Grace Fisher 2 by Isabelle Grey(19411)
Shot Through the Heart by Mercy Celeste(19271)
Wolf & Parchment: New Theory Spice & Wolf, Vol. 10 by Isuna Hasekura and Jyuu Ayakura(17422)
Python GUI Applications using PyQt5 : The hands-on guide to build apps with Python by Verdugo Leire(17404)
Peren F. Statistics for Business and Economics...Essential Formulas 3ed 2025 by Unknown(17239)
Wolf & Parchment: New Theory Spice & Wolf, Vol. 03 by Isuna Hasekura and Jyuu Ayakura & Jyuu Ayakura(17139)
Wolf & Parchment: New Theory Spice & Wolf, Vol. 01 by Isuna Hasekura and Jyuu Ayakura & Jyuu Ayakura(16751)
The Subtle Art of Not Giving a F*ck by Mark Manson(14987)
The 3rd Cycle of the Betrayed Series Collection: Extremely Controversial Historical Thrillers (Betrayed Series Boxed set) by McCray Carolyn(14480)
Stepbrother Stories 2 - 21 Taboo Story Collection (Brother Sister Stepbrother Stepsister Taboo Pseudo Incest Family Virgin Creampie Pregnant Forced Pregnancy Breeding) by Roxi Harding(14317)
Cozy crochet hats: 7 Stylish and Beginner-Friendly Patterns from Baby Beanies to Trendy Bucket Hats by Vanilla Lazy(13565)
Scorched Earth by Nick Kyme(13138)
Reichel W. Numerical methods for Electrical Engineering, Meteorology,...2022 by Unknown(13009)
Drei Generationen auf dem Jakobsweg by Stein Pia(11302)