Kotlinでセカンダリコンストラクターを宣言するにはどうすればよいですか?
それに関するドキュメントはありますか?
以下はコンパイルされません...
class C(a : Int) {
// Secondary constructor
this(s : String) : this(s.length) { ... }
}
Update:M11(0.11。*)以降、Kotlinは secondary constructors をサポートしています。
今のところ、Kotlinはプライマリコンストラクターのみをサポートしています(セカンダリコンストラクターは後でサポートされる場合があります)。
セカンダリコンストラクターのほとんどのユースケースは、以下の手法のいずれかによって解決されます。
テクニック1。(ケースを解決します)クラスの隣にファクトリメソッドを定義します
fun C(s: String) = C(s.length)
class C(a: Int) { ... }
使用法:
val c1 = C(1) // constructor
val c2 = C("str") // factory method
テクニック2。(役に立つかもしれません)パラメータのデフォルト値を定義します
class C(name: String? = null) {...}
使用法:
val c1 = C("foo") // parameter passed explicitly
val c2 = C() // default value used
デフォルト値は、コンストラクターだけでなく、どの関数でも機能することに注意してください
テクニック3。(カプセル化が必要な場合)コンパニオンオブジェクトで定義されたファクトリメソッドを使用する
コンストラクタをプライベートにし、ファクトリメソッドのみをクライアントで使用できるようにする場合があります。現時点では、これはコンパニオンオブジェクトで定義されたファクトリメソッドでのみ可能です。
class C private (s: Int) {
companion object {
fun new(s: String) = C(s.length)
}
}
使用法:
val c = C.new("foo")
ドキュメントポイント として、この方法でセカンダリコンストラクターを使用できます
class GoogleMapsRestApiClient constructor(val baseUrl: String) {
constructor() : this("https://api.whatever.com/")
}
最初のコンストラクターの動作を拡張する必要があることに注意してください。
セカンダリコンストラクターKotlinを宣言するには、constructorキーワードを使用します。
これはプライマリコンストラクターです。
class Person constructor(firstName: String) {
}
または
class Person(firstName: String) {
}
次のようなセカンダリコンストラクターコードの場合:
class Person(val name: String) {
constructor(name: String, parent: Person) : this(name) {
parent.children.add(this)
}
}
プライマリconstructorを呼び出すことが必須です。それ以外の場合、compilerはスローされます次のerror
Primary constructor call expected
init
を持つコンストラクター:
class PhoneWatcher : TextWatcher {
private val editText: EditText
private val mask: String
private var variable1: Boolean = false
private var variable2: Boolean = false
init {
variable1 = false
variable2 = false
}
constructor(editText: EditText) : this(editText, "##-###-###-####")
constructor(editText: EditText, mask: String) {
this.editText = editText
this.mask = mask
}
...
}
constructor
を使用してKotlinで複数のコンストラクターを定義できますが、デフォルトのコンストラクターclass AuthLog(_data: String)
をスキップする必要があります
class AuthLog {
constructor(_data: String): this(_data, -1)
constructor(_numberOfData: Int): this("From count ", _numberOfData)
private constructor(_data: String, _numberOfData: Int)
}
更新
これで、デフォルトのコンストラクタを定義できます
class AuthLog(_data: String, _numberOfData: Int) {
constructor(_data: String): this(_data, -1) {
//TODO: Add some code here if you want
}
constructor(_numberOfData: Int): this("From count", _numberOfData)
}
私はこの質問を見たばかりで、アンドレイが提案したものよりも優れた別のテクニックがあるかもしれないと思います。
class C(a: Int) {
class object {
fun invoke(name: String) = C(name.length)
}
}
invoke
メソッドは、Scalaでapply
メソッドが機能するのと同じように機能するため、val c:C = C(3)
またはval c:C = C("abc")
のように記述できます。
更新
現在、セカンダリコンストラクターは既に言語仕様の一部であるため、この回避策は使用しないでください。
以下のコードスニペットは動作するはずです
class C(a:Int){
constructor(s:String):this(s.length){..}
}
class Person(val name: String) {
constructor(name: String, parent: Person) : this(name) {
parent.children.add(this)
}
}
これを試すことができます。
私はほとんどの答えに少し混乱しました。わかりやすくするために、より多くの要素を持つ例を追加しています。
@JsonInclude(JsonInclude.Include.NON_NULL)
data class Response(val code: String) {
var description: String? = null
var value: String? = null
constructor(code: String, description: String?) : this(code) {
this.description = description
}
constructor(code: String, description: String?, value: String) : this(code, description) {
this.value = value
}
}
kotlinセカンダリコンストラクターの例
class Person(name: String){
var name=""
var age=0
constructor(age :Int,name : String) : this(name){
this.age=age
this.name=name
}
fun display(){
print("Kotlin Secondary constructor $name , $age")
}
}
主な機能
fun main(args : Array<String>){
var objd=Person(25,"Deven")
objd.display()
}