In Scala I need to do something like following code in Java does:
public class A {
private String text;
public A(String text) {
this.text = text;
}
}
How can achieve that in Scala?
I know that I can use class A(text: String) { ... }, but this is only a very simplified example and not real case.
I have tried the following and it prints always null:
class A {
var text: String = null
def this(text: String) = {
this()
this.text = text
}
println(text)
}
Thanks for help.
In Scala classes have only one main constructor, and it’s exactly what you define like this:
class A(text: String) { ... }. All other constructors should call it at first and then do their own stuff.All expressions in the body of the class are treated as body of the main constructor. So
println(text)in you case is in the body of the main constructor. You callthis()in yourdef this(text: String)constructor at first, soprintlnis executed and only then you initializetextfield.From my point of view, main constructor can satisfy most of the real-life use-cases (especially with default and named arguments). So can you please elaborate on this and explain why you need the second one? Maybe we can find beter solution for the problem you are facing there.
Update regarding the comment
If you want to provide a set of optional arguments during construction time, then I recommend you to use
Optioninstead ofnullvalues. So you can implement yourAclass like this:All fields are now constant and have some default, but you can customize some of them. It’s also possible that some combination of arguments are mutually exclusive, according to some business logic, for example. In this case it’s reasonable to use several constructors. But even better solution can be to create several factory methods in companion object of the class and make constructor private. For example, if users of the class are allowed to provide either
aandborc, then you can write something like this: