Scala Tutorial
Basics
Control Statements
OOP Concepts
Parameterized - Type
Exceptions
Scala Annotation
Methods
String
Scala Packages
Scala Trait
Collections
Scala Options
Miscellaneous Topics
In Scala, access modifiers control the visibility of classes, objects, traits, methods, and fields. They determine from where members can be accessed or modified. Scala provides a more flexible system than many other languages. Here's a breakdown:
Public:
By default, members are public. There's no public
keyword in Scala; you just leave off an access modifier.
class Person { val name = "John" // This is public by default }
Private:
Members marked private
are visible only inside the class or object that contains them.
class Person { private val secret = "This is a secret" }
An interesting aspect of Scala's private
is that when it's used inside an object
, it is only accessible within that specific object, not instances of a companion class or even subclasses.
Protected:
Members marked protected
are accessible from subclasses. Unlike Java, protected
in Scala does not allow access from any class in the same package.
class Animal { protected val sound = "sound" } class Dog extends Animal { def makeSound(): String = sound }
Private[this]:
This is an even more restricted version of private
. A member with this modifier can be accessed only from the current object instance, not from other instances of the same class.
class Example { private[this] val secret = "Super Secret" def isSameAs(x: Example): Boolean = { // secret == x.secret // This would be an error true } }
Private[Scope]:
Scala provides a way to make members visible to specific scopes by using private[Scope]
where Scope
is a package, class, or singleton object. This provides a controlled widening of the accessibility of the member.
package foo { class Example { private[foo] val data = "Accessible within foo package" } }
Protected[Scope]:
Similarly, protected
can also be qualified with a scope. It means the member is protected but still accessible from the specified scope.
package bar { class Example { protected[bar] val info = "Protected within bar package" } }
In conclusion, Scala provides a rich set of access modifiers, allowing for fine-grained control over visibility and accessibility. Proper use of these can help in achieving strong encapsulation, making your code safer and more modular.
Public and private access in Scala:
class MyClass { val publicMember: Int = 42 private val privateMember: String = "Secret" }
Scala protected access modifier:
protected
modifier restricts access to the same class, subclasses, and companion objects.class MyBaseClass { protected val protectedMember: Double = 3.14 } class MyDerivedClass extends MyBaseClass { def accessProtectedMember(): Double = protectedMember }
Package-private access in Scala:
package mypackage class MyPackageClass { // Package-private access val packagePrivateMember: String = "Hello" }
Access modifiers in Scala classes:
class MyClass { val publicMember: Int = 42 private val privateMember: String = "Secret" protected val protectedMember: Double = 3.14 }
Scala object-private access:
class MyClass { private[this] val objectPrivateMember: Boolean = true def isEqual(other: MyClass): Boolean = { // Can access other's objectPrivateMember this.objectPrivateMember == other.objectPrivateMember } }
Companion objects and access control in Scala:
class MyClass { private val privateMember: String = "Secret" } object MyClass { def accessPrivateMember(instance: MyClass): String = instance.privateMember }
Scala access modifiers and inheritance:
class MyBaseClass { protected val protectedMember: Double = 3.14 } class MyDerivedClass extends MyBaseClass { def accessProtectedMember(): Double = protectedMember }
Scoping and visibility in Scala:
class ScopeExample { // Public member accessible outside the class val publicMember: Int = 42 def doSomething(): Unit = { // Scope: Accessible within the method val localVar: String = "Local" println(localVar) } }
Encapsulation in Scala with access modifiers:
class EncapsulationExample { private var data: String = "Sensitive" def getData(): String = data def setData(newData: String): Unit = { // Encapsulation: Validate or manipulate data before updating if (newData.length > 5) { data = newData } } }
Access modifiers in Scala traits:
trait MyTrait { protected val protectedMember: Double = 3.14 } class MyClass extends MyTrait { def accessProtectedMember(): Double = protectedMember }
Scala access control hierarchy:
// Public access (default) class PublicClass { val publicMember: Int = 42 } // Protected access class ProtectedClass { protected val protectedMember: Double = 3.14 } // Package-private access package mypackage { class PackagePrivateClass { val packagePrivateMember: String = "Hello" } } // Private access class PrivateClass { private val privateMember: String = "Secret" }
Abstract members and access modifiers in Scala:
abstract class MyAbstractClass { protected def abstractMethod(): Unit } class MyConcreteClass extends MyAbstractClass { protected def abstractMethod(): Unit = { // Implementation in the subclass } }