余っているAndroidスマホをオシロにしよう!
前回、kotlinでclassをまたぐ大域変数を使えなくて不便だぶーと書きました.
android.app.Application を活用すると大域変数のように使えると知りました.Application classの中に書いた変数を、いろんなclassから呼び出せるという仕組みのようです.そうよそれよそれ、と思って使ってみたのですがイマイチでした.
どのようなclassからでも呼び出せるわけではないんです.Activity classを継承したclassでのみ有効です.Activityとは無縁のclassには無効です.それじゃぁ使えない.
ただしその回避策はあるらしいです.Activityと無縁のclassへActivityを教えてやればいいと.すなわち、setActivity(act : Activity)みたいな自作関数で上意下達するということです.
でもその回避策を知って、それならandroid.app.Applicationを使う必要ないじゃんと思っちゃった.
こうしたらどうだなんろう?
・Main Activity→class1→class2→class3とインスタンスする階層構造だとする(下図)
・Main Activity→parameter classをインスタンスする(大域変数を格納しておく)
・Main,class123の全てからparameterへアクセスできるようにしたい
・fun setparam(parameter)を自作してparameterを上意下達する
・結果としてclass123からも、parameter.xxxを大域変数的に利用できる
それで構造を作り変えてるところ.
↓これからtriggerを実装するので、時間軸のブレを作るためにノイズを加算したの図.
かしこ
いつかKotlinをやろうと思ってたんですけど、kotlinはStaticが使えないんですね。
返信削除勉強になりました。
ただ、調べてみるとcompanion object {}を使うとclass変数が使えると。
-------------------------------------------
fun main(args: Array) {
// Your code here!
println(Grobals.myVar)
Grobals.myVar="Foo"
println(Grobals.myVar)
}
class Grobals {
companion object {
@JvmField var myVar = "Hoge"
}
}
-------------------------------------------
外してたらすいません。
でも平坂さん、なんでも出来てすごいですね。
もとい
返信削除<String>がエスケープされてしまいましたね。
fun main(args: Array<String>) {
// Your code here!
println("XXXXXXXX")
println(Grobals.myVar)
Grobals.myVar="Foo"
println(Grobals.myVar)
}
class Grobals {
companion object {
@JvmField var myVar = "Hoge"
}
}
======実行結果=================
XXXXXXXX
Hoge
Foo
===========================
「Kotlinはstaticなし」というフレーズはよく見かけますがその意味が判ってないわたしです。
削除たしかCにはstaticあったですがあれとは意味が違う予感はしてるとこでぇす。
お恥ずかしいスペルミスしました。GrobelsじゃなくてGlobalsですね。
返信削除>たしかCにはstatic~
CのStaticと同じ意味と捉えて問題ないと個人的には思っています。
kotlinの言語設計者はいわゆる「Staticおじさん」をバカにしてたのかもしれませんね。
昨今の関数型言語の流行をみると、そんなに「Staticおじさん」が悪かったのかとも思いますが。
上の大域変数的運用に作り替えたらプログラムがとても判り易くなりました.
削除ありがとうグローバル.
ま、なんつうか、大域変数を変更するのは隠蔽しておくとしても、大域変数を参照するのは誰にでもできるというぐらいがちょうどいいです、わたしには.