Vals are initialized in the order they are declared (well, precisely, non-lazy vals are), so properties
is getting initialized before loadedProps
. Or in other words, loadedProps
is still null
when properties
is getting initialized.
The simplest solution here is to define loadedProps
before properties
:
class Config {
private val loadedProps = {
val p = new Properties()
p.load(Thread.currentThread().getContextClassLoader.getResourceAsStream("props"))
p
}
val properties: Properties = loadedProps
val forumId = properties.get("forum_id")
}
You could also make loadedProps
lazy, meaning that it will be initialized on its first access:
class Config {
val properties: Properties = loadedProps
val forumId = properties.get("forum_id")
private lazy val loadedProps = {
val p = new Properties()
p.load(Thread.currentThread().getContextClassLoader.getResourceAsStream("props"))
p
}
}
Using lazy val has the advantage that your code is more robust to refactoring, as merely changing the declaration order of your vals won’t break your code.
Also in this particular occurence, you can just turn loadedProps
into a def
(as suggested by @NIA) as it is only used once anyway.