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
PragPub 2012-06: Issue #36 by The Pragmatic Bookshelf.mobi
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.
Personalized inhaled bacteriophage therapy for treatment of multidrug-resistant Pseudomonas aeruginosa in cystic fibrosis by unknow(175708)
CONSORT 2025 statement: updated guideline for reporting randomized trials by unknow(84128)
Critical evaluation of the ProfiLER-02 study design and outcomes by Vivek Subbiah & Razelle Kurzrock(83781)
Cardiac gene therapy makes a comeback by Oliver J. Müller & Susanne Hille & Anca Kliesow Remes(83571)
Whisky: Malt Whiskies of Scotland (Collins Little Books) by dominic roskrow(74438)
Unveiling the design rules for tunable emission in graphene quantum dots: A high-throughput TDDFT and machine learning perspective by Şener Özönder & Mustafa Coşkun Özdemir & Caner Ünlü(50893)
A yeast-based oral therapeutic delivers immune checkpoint inhibitors to reduce intestinal tumor burden by unknow(40260)
Covalent hitchhikers guide proteins to the nucleus by Alexander F. Russell & Madeline F. Currie & Champak Chatterjee(40216)
Meet the Authors: Christopher R. Mansfield and Emily R. Derbyshire by Christopher R. Mansfield & Emily R. Derbyshire(40096)
Alkaline-earth metals promote propane dehydrogenation with carbon dioxide through geometric effects: Altering the reaction pathway by unknow(32731)
Induced iron vacancies boosting FeOOH loaded on sustainable Fenton-like collagen fiber membrane for efficient removal of emerging contaminants by unknow(32508)
Efficient electric-field-assisted photochemical conversion of methane to n-propanol exclusively over penetrated TiO2Ti hollow fibers by Guanghui Feng(32453)
Bi2SiO5 nanosheets as piezo-photocatalyst for efficient degradation of 2,4-Dichlorophenol by Hangyu Shi & Yifu Li & Lishan Zhang & Guoguan Liu & Qian Zhang & Xuan Ru & Shan Zhong(32387)
A novel NDIPTA organic heterojunction photocatalyst with built-in electric field for efficient hydrogen production by Jiahui Yang & Baojun Ma & Yongfa Zhu(32361)
Enhanced conversion of methane to liquid-phase oxygenates via hollow ferrite nanotube@horseradish peroxidase based photoenzymatic catalysis by Jun Duan & Shiying Fan & Xinyong Li & Shaomin Liu(32333)
Ordered macroporous superstructure of defective carbon adorned with tiny cobalt sulfide for selective electrocatalytic hydrogenation of cinnamaldehyde by Xiao-Shi Yuan & Sheng-Hua Zhou & San-Mei Wang & Wenbo Wei & Xiaofang Li & Xin-Tao Wu & Qi-Long Zhu(32257)
What's Done in Darkness by Kayla Perrin(27148)
Topological analysis of non-conjugated ethylene oxide cored dendrimers decorated with tetraphenylethylene: Insights from degree-based descriptors using the polynomial approach by A Theertha Nair & D Antony Xavier & Annmaria Baby & S Akhila(26523)
Investigation of mechanical and self-healing properties of hydroxyl-terminated polybutadiene functionalized with 2-ureido-4-pyrimidinone by Mohsen Kazazi & Mehran Hayaty & Ali Mousaviazar(26458)