// Java code
public class User {
String name;
public User(String name) {
this.name = name
}
}
class User{
var name = ""
constructor(name: String) {
this.name = name
}
}
Convert to primary constructor ,提示你可以把程式寫成這樣class User(var name: String) {
}
Primary constructorPrimary constructor 就會有 Secondary constructor–
Primary constructor 顧名思義就是主要的建構子Primary constructorclass User constructor(name: String) {
}
class User public @Inject constructor(name: String) {
}
class User(name: String) {
}
class User(name: String, age: Int = 18) {
}
Primary constructor 無法包含任何程式碼,如果你需要則可寫在 init 區塊內class User(name: String) {
var userName: String
init {
userName = name
// do something
}
}
class User(name: String) {
var userName = name
}
Unresolved reference: nameclass User constructor(name: String) {
var userName = name
init {
userName = name //
}
fun doSomething(){
val sonmeName = name // Unresolved reference: name
}
}
// Java code
public class User {
String userName;
public User(String name) {
this.userName = name
}
public void doSomething() {
String sonmeName = name; // Unresolved reference: name
}
}
name 根本不在 doSomething() 的 scope 內,因此呼叫得到 name 的只有同在建構子內的 init functionval or var 即可,引數也能加上存取修飾字(Visibility modifiers)class User constructor(private val name: String) {
var userName = name
init {
userName = name
}
fun doSomething(){
val sonmeName = name
}
}
class Singleton private constructor() {
init {
println("Singleton init")
}
companion object {
val instance = Singleton()
}
}
Singleton() 編譯器會報錯 Cannot access '<init>': it is private in 'Singleton' 因此只能使用 Singleton.instance–
Secondary constructor 語意上說是次要的建構子,可以理解成輔助 Primary constructor,並且 Secondary constructor 必須委派 Primary constructor,如果你忘記委派 Primary constructor 編譯時則會出現 Primary constructor call expectedclass Priflie(name: String) {}
class User(name: String) {
constructor(profile: Profile) { // Primary constructor call expected
// ...
}
}
class Priflie(name: String) {}
class User(name: String) {
constructor(profile: Profile): this(profile.name) {
// ...
}
}
// Java code
public class User {
public User(String name) {
// ...
}
public User(Proffile profile) {
this(profile.name)
}
}
class Priflie(name: String) {}
class User(name: String){
init {
println("Primary constructor")
}
constructor(profile: Profile): this(profile.name) {
println("Secondary constructor")
}
}
fun main(){
User(Profile("Aki"))
}
Primary constructor
Secondary constructor
class User {
}
