Tôi có lớp Kotlin sau đây với một nhà xây dựng chính,cú pháp xây dựng Secondary Kotlin
class Person(first: String, last: String, age: Int){
init{
println("Initializing")
}
}
Tôi muốn thêm một constructor thứ mà phân tích một fullname vào một tên first
và last
và kêu gọi các nhà xây dựng chính. Tuy nhiên, tôi không thể có được đúng cú pháp ...
class Person(first: String, last: String, age: Int){
// Secondary constructor
constructor(fullname: String, age: Int):
this("first", "last", age)
{
println("In secondary constructor")
}
init{
println("Initializing")
}
}
này hoạt động tốt, vì tôi không thực sự phân tích fullname
trong constructor thứ yếu. Khi tôi đi trước và cố gắng phân tích fullname,
constructor(fullname: String, age: Int):
var first = fullname.split()[0];
...
{
println("In secondary constructor")
}
tôi nhận được một tài liệu tham khảo chưa được giải quyết: fullname. Nó không tồn tại trong phạm vi, nhưng nếu tôi đặt nó trong dấu ngoặc, sau đó tôi không thể gọi các nhà xây dựng chính qua this
,
constructor(fullname: String, age: Int):
{
var first = fullname
this(first, "foo", age)
println("In secondary constructor")
}
tôi nhận được một lỗi liên quan đến một thiếu invoke
chức năng.
Không thể tìm thấy ví dụ điển hình về trường hợp này trên tài liệu Kotlin, xin lỗi.
Bạn luôn có thể tiếp xúc với phương pháp nhà máy và ủy những người như trái ngược với nhà xây dựng, cho phép bạn quyết định khi nào thực sự ủy nhiệm, hoặc chỉ không khai báo các biến cho 'first' và 'last' trong constructor thứ hai của bạn. Nhưng nếu bạn không nhớ tôi hỏi, tại sao bạn phải phơi bày 'Người (đầu, cuối, tuổi) 'VÀ' Người (tên đầy đủ, tuổi) '? Điều gì sẽ xảy ra nếu khách hàng quên thêm dấu cách giữa đầu tiên và cuối cùng khi sử dụng 'fullName'? Bạn không thể khai báo một biến trước khi hàm tạo hàm tạo. –
Đây chỉ là một ví dụ đồ chơi, tôi sẽ không thực sự xây dựng hai nhà thầu này. Bạn đang nói rằng tôi không thể sử dụng một constructor thứ cấp theo cách này? Trong java đơn giản, tôi nghĩ bạn có thể khai báo các biến trong các hàm tạo thứ cấp? Vì vậy, tôi đoán đây chỉ là một ví dụ xấu, và nó đánh vào một trường hợp sử dụng mà mã hóa tốt sẽ tránh? –
Có, bạn không thể sử dụng hàm tạo thứ cấp theo cách này. 'this' là một đoàn đại biểu, đó là lý do tại sao bạn không thể sử dụng nó trong niềng răng. Bạn sẽ phải làm điều gì đó dọc theo dòng 'constructor (...): this (fullName.split (" ") [0], fullName.split (" ") [1])' có tiềm năng để lập chỉ mục giới hạn. –