Private and Protected

private Members

Example

class PasswordManager {
    private val passwords = mutableMapOf<String, String>()

    private fun hash(pw: String) = pw.reversed() + pw.length   // toy hash, hidden

    fun save(site: String, pw: String) { passwords[site] = hash(pw) }
    fun check(site: String, pw: String) = passwords[site] == hash(pw)
}

fun main() {
    val pm = PasswordManager()
    pm.save("gmail", "secret123")
    println(pm.check("gmail", "secret123"))
    println(pm.check("gmail", "guess"))
    // pm.passwords  -> error: Cannot access 'passwords': it is private
}

Output

true
false

protected Members

Example

protected members are visible to subclasses, but not to outside code.

open class Screen {
    protected var title = "Untitled"
    protected fun log(msg: String) = println("[${title}] $msg")
}

class HomeScreen : Screen() {
    fun open() {
        title = "Home"           // OK: subclass can use protected members
        log("opened")
    }
}

fun main() {
    HomeScreen().open()
    // HomeScreen().title     -> error: it is protected
}

Output

[Home] opened

Private Constructor

class DatabaseClient private constructor(val url: String) {
    companion object {
        fun create(env: String) = DatabaseClient(if (env == "prod") "db.prod" else "db.local")
    }
}
// DatabaseClient("x")             // error: constructor is private
// DatabaseClient.create("prod")   // OK