kotlinノート:Objectキーワード
21432 ワード
Objectキーワード
kotlinのobjectキーワードは、シーンを使用するオブジェクトを作成するために使用されます.
オブジェクト宣言
オブジェクト宣言は、単一のインスタンスを作成するために使用されます.
クラスと同様に、オブジェクトの宣言には、属性、メソッド、初期化文ブロックなどの宣言も含まれます.唯一の違いは、オブジェクトに構築方法(プライマリとセカンダリ)がないことです.オブジェクト宣言は定義時にすぐに作成されるので、関数を構築する必要はありません.
クラス外部でもクラス内部でも単一のオブジェクトを生成できますが、funでは単一のオブジェクトを生成できません.
例:fun main(args: Array<String>) {
SuperMan.power()
TheFlash.power()
BatMan.power()
compareSpeed(SuperMan, TheFlash, BatMan)
}
abstract class SuperHero(open var energy: Int = 100, open var speed: Int = 100) {
abstract fun power()
}
object SuperMan : SuperHero() {
override var speed = 1000
override fun power() {
lasing()
}
private fun lasing() {
println(">------------------")
}
}
object TheFlash : SuperHero() {
override var speed = 1500
override fun power() {
runOnLake()
}
private fun runOnLake() {
println("~~~~~~~~/\\~~~~~~~~~")
}
}
object BatMan : SuperHero() {
override var speed = 10
override fun power() {
justRich()
}
private fun justRich() {
println("$$$$$$$$$$$$$$$$$$$")
}
}
object SpeedComparator : Comparator<SuperHero> {
override fun compare(s1: SuperHero, s2: SuperHero): Int {
return s1.speed.compareTo(s2.speed)
}
}
fun compareSpeed(vararg heros: SuperHero) {
var list = mutableListOf<SuperHero>()
list.addAll(heros)
println(list.sortedWith(SpeedComparator))
}
出力:>------------------
~~~~~~~~/\~~~~~~~~~
$$$$$$$$$$$$$$$$$$$
[BatMan, SuperMan, TheFlash]
伴生対象
クラスでcompanion objectキーワードを使用して修飾されたオブジェクト.
kotlinにはstaticキーワードはありません.代わりに、kotlinにはパッケージレベル関数、オブジェクト宣言、および伴生オブジェクトがあります.
JAvaクラスではprivateが本クラスでアクセスできるため、クラスのstaticメソッドはクラスのプライベートメソッドとクラスオブジェクトのプライベート変数にアクセスできます.
fun main(args: Array<String>) {
SuperMan.power()
TheFlash.power()
BatMan.power()
compareSpeed(SuperMan, TheFlash, BatMan)
}
abstract class SuperHero(open var energy: Int = 100, open var speed: Int = 100) {
abstract fun power()
}
object SuperMan : SuperHero() {
override var speed = 1000
override fun power() {
lasing()
}
private fun lasing() {
println(">------------------")
}
}
object TheFlash : SuperHero() {
override var speed = 1500
override fun power() {
runOnLake()
}
private fun runOnLake() {
println("~~~~~~~~/\\~~~~~~~~~")
}
}
object BatMan : SuperHero() {
override var speed = 10
override fun power() {
justRich()
}
private fun justRich() {
println("$$$$$$$$$$$$$$$$$$$")
}
}
object SpeedComparator : Comparator<SuperHero> {
override fun compare(s1: SuperHero, s2: SuperHero): Int {
return s1.speed.compareTo(s2.speed)
}
}
fun compareSpeed(vararg heros: SuperHero) {
var list = mutableListOf<SuperHero>()
list.addAll(heros)
println(list.sortedWith(SpeedComparator))
}
>------------------
~~~~~~~~/\~~~~~~~~~
$$$$$$$$$$$$$$$$$$$
[BatMan, SuperMan, TheFlash]
クラスでcompanion objectキーワードを使用して修飾されたオブジェクト.
kotlinにはstaticキーワードはありません.代わりに、kotlinにはパッケージレベル関数、オブジェクト宣言、および伴生オブジェクトがあります.
JAvaクラスではprivateが本クラスでアクセスできるため、クラスのstaticメソッドはクラスのプライベートメソッドとクラスオブジェクトのプライベート変数にアクセスできます.
パケットレベル関数は、javaの静的メソッド、静的変数を伴生オブジェクトとともに構成します.オブジェクト宣言は、特殊な「クラスと伴生オブジェクトが1つになる」オブジェクトです.
例:
fun main(args: Array<String>) {
var bigHouse = House.newBigHouse()
var smallHouse = House.newSmallHouse()
}
class House private constructor(var width: Int = 100, var height: Int = 6) {
// ,
companion object {
fun newBigHouse() = House(100, 100)
fun newSmallHouse() = House(20, 20)
}
}
通常のオブジェクトの伴生オブジェクトとして
伴生オブジェクトは、クラス内の静的内部クラスのオブジェクトに相当し、名前、インタフェースを実装でき、拡張関数を持つこともできます.
インスタンス(拡張関数):
fun main(args: Array<String>) {
var bigHouse = House.newBigHouse()
var smallHouse = House.newSmallHouse()
bigHouse.computeArea()
smallHouse.computeArea()
House.computeArea()
}
class House private constructor(var length: Int, var width: Int) {
companion object {
fun newBigHouse() = House(100, 100)
fun newSmallHouse() = House(20, 20)
}
}
// ,
fun House.computeArea() {
println(this.length * this.width)
}
// ,
fun House.Companion.computeArea() {
println("I can not access private member and method")
}
出力:
10000
400
I can not access private member and method
オブジェクト式
これはkotlinの匿名の内部クラスで、javaとは異なり、複数のインタフェースを実装したり、インタフェースを実装したりすることができます.また、final以外の変数にもアクセスできます.
例:fun main(args: Array<String>) {
var button = Button()
var buttonClickCount = 0
// object
button.clickListener = object : ClickListener, LongClickListener {
override fun onClick() {
// onClick var ( final )
buttonClickCount++
println("you click me $buttonClickCount Time!")
}
override fun onLongClick() {
println("you long click me!")
}
}
for (i in 1..4) {
button.beenClick()
}
}
class Button {
var clickListener: ClickListener? = null
fun beenClick() {
clickListener?.onClick()
}
}
interface ClickListener {
fun onClick()
}
interface LongClickListener {
fun onLongClick()
}
出力:you click me 1 Time!
you click me 2 Time!
you click me 3 Time!
you click me 4 Time!
fun main(args: Array<String>) {
var button = Button()
var buttonClickCount = 0
// object
button.clickListener = object : ClickListener, LongClickListener {
override fun onClick() {
// onClick var ( final )
buttonClickCount++
println("you click me $buttonClickCount Time!")
}
override fun onLongClick() {
println("you long click me!")
}
}
for (i in 1..4) {
button.beenClick()
}
}
class Button {
var clickListener: ClickListener? = null
fun beenClick() {
clickListener?.onClick()
}
}
interface ClickListener {
fun onClick()
}
interface LongClickListener {
fun onLongClick()
}
you click me 1 Time!
you click me 2 Time!
you click me 3 Time!
you click me 4 Time!