Get Even More Visitors To Your Blog, Upgrade To A Business Listing >>

Scala: Traits

 

Scala do not have interface, but it support same functionality using traits. A Trait in Scala can have abstract fields, class that implements this trait must provide values to these abstract fields.

 

Syntax

trait TraitName{

     ......

     ......

}

 

Example

trait SortData{

    

     def sort() = {

          .....

          .....

     }

 

}

 

Can a trait extends other trait?

Yes

 

trait StringSort extends SortData {

     .......

     .......

}

 

Can a class extend multiple traits?

Yes

 

Can a trait have concrete methods?

Yes

 

Can a trait have concrete fields?

Yes

 

Let’s implement trait with simple Logger example.


Step 1: Define Logger trait.

trait Logger {
def logInfo(msg: String): Unit = println(msg)
def logWarning(msg: String): Unit = println(msg)
def logError(msg: String): Unit = println(msg)
}

Step 2: Define ConsoleLogger and DBLogger traits.

trait ConsoleLogger extends Logger {
override def logInfo(msg: String): Unit = {
val date = new java.util.Date()

println(s"$date $msg")

}

override def logWarning(msg: String): Unit = {
logInfo(msg)
}

override def logError(msg: String): Unit = {
logInfo(msg)
}

}

trait DBLogger extends Logger {}

Step 3: Define a class and extend Logger trait.

class UserService extends Logger {
def registerNewUser(id: Int, name: String) = {
logInfo(s"user id: $id and name: $name registered successfully!!!!")
}
}

Now you can supply any Logger trait to the UserService object and use.

 

Example 1: UserService instance with Logger trait

val userService1 = new UserService() with Logger

 

Example 2: UserService instance with ConsoleLogger trait

val userService2 = new UserService() with ConsoleLogger

 

Find the below working application.

 

TraitDemo.scala

package com.sample.app

object TraitDemo extends App {
trait Logger {
def logInfo(msg: String): Unit = println(msg)
def logWarning(msg: String): Unit = println(msg)
def logError(msg: String): Unit = println(msg)
}

trait ConsoleLogger extends Logger {
override def logInfo(msg: String): Unit = {
val date = new java.util.Date()

println(s"$date $msg")

}

override def logWarning(msg: String): Unit = {
logInfo(msg)
}

override def logError(msg: String): Unit = {
logInfo(msg)
}

}

trait DBLogger extends Logger {}

class UserService extends Logger {
def registerNewUser(id: Int, name: String) = {
logInfo(s"user id: $id and name: $name registered successfully!!!!")
}
}

val userService1 = new UserService() with Logger
val userService2 = new UserService() with ConsoleLogger

userService1.registerNewUser(1, "Krishna")
userService2.registerNewUser(1, "Krishna")
}






Previous                                                    Next                                                    Home


This post first appeared on Java Tutorial : Blog To Learn Java Programming, please read the originial post: here

Share the post

Scala: Traits

×

Subscribe to Java Tutorial : Blog To Learn Java Programming

Get updates delivered right to your inbox!

Thank you for your subscription

×