Javaのコード見てると連想配列で複雑な型付きオブジェクトを作成できるTypeScriptに戻りたくなる
Javaのコード見てると連想配列で複雑な型付きオブジェクトを作成できるTypeScriptに戻りたくなる
code:ts
/** 車の型 */
interface Car {
name: string
transmissionType: "AT" | "MT"
owner: User
}
/** 人の型 */
interface Human {
name: string
age: number
}
// ↓たったこれだけで車の情報を格納できる
const myCar = {
name: "prius"
transmissionType: "AT"
owner: {
name: "GyakSoG"
age: 62
}
}
知らないだけでJavaでもこういう詳細な型定義ってできるのかな?
classたくさん作る以外で
classたくさん作るのはごちゃつくから嫌い
以下のようにKotlinに変換できます。
code:fromCopilot.kt
// 車の型
interface Car {
var name: String
var transmissionType: String
var owner: Human
}
// 人の型
interface Human {
var name: String
var age: Int
}
// オブジェクトの作成
val myCar = object: Car {
override var name = "prius"
override var transmissionType = "AT"
override var owner = object: Human {
override var name = "GyakSoG"
override var age = 62
}
}
ただし、Kotlinでは"AT" | "MT"のような型はサポートされていないため、transmissionTypeはString型としています。これを厳密に制限したい場合は、enumを使用することを検討してみてください。
enumを用いた場合、enum class TransmissionType { AT, MT}って定義してTransmissionType.ATって代入しないといけないのがちょっと長くて嫌だね
と思ったけど、リテラル型ってもともと列挙型がなかったJavaScriptやPythonのためにあって、列挙型が元からある言語に更にリテラル型を増やすと冗長になるのか Javaならこうらしい
code:fromCopilot.java
// 車の型
public class Car {
public String name;
public String transmissionType;
public Human owner;
}
// 人の型
public class Human {
public String name;
public int age;
}
// オブジェクトの作成
Car myCar = new Car();
myCar.name = "prius";
myCar.transmissionType = "AT";
myCar.owner = new Human();
myCar.owner.name = "GyakSoG";
myCar.owner.age = 62;
変数.プロパティ名っていちいち書かなきゃいけないのが冗長に感じる
Kotlinのoverride varより短いから完全に気の所為だけど