2022年4月2日土曜日

【Android USB oscilloscope】(21) 大域変数を納めたclass

余っている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を大域変数的に利用できる
setparam(parameter)が参照渡しされるのかコピー渡しされるのかという疑問が在ったのですが、やってみたら動いてます.うごきゃいいや.

それで構造を作り変えてるところ.

↓これからtriggerを実装するので、時間軸のブレを作るためにノイズを加算したの図.

20へ          22へ

かしこ

5 件のコメント:

  1. いつか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"
    }
    }
    -------------------------------------------

    外してたらすいません。
    でも平坂さん、なんでも出来てすごいですね。

    返信削除
  2. もとい
    <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

    ===========================

    返信削除
    返信
    1. 「Kotlinはstaticなし」というフレーズはよく見かけますがその意味が判ってないわたしです。
      たしかCにはstaticあったですがあれとは意味が違う予感はしてるとこでぇす。

      削除
  3. お恥ずかしいスペルミスしました。GrobelsじゃなくてGlobalsですね。

    >たしかCにはstatic~

    CのStaticと同じ意味と捉えて問題ないと個人的には思っています。
    kotlinの言語設計者はいわゆる「Staticおじさん」をバカにしてたのかもしれませんね。

    昨今の関数型言語の流行をみると、そんなに「Staticおじさん」が悪かったのかとも思いますが。

    返信削除
    返信
    1. 上の大域変数的運用に作り替えたらプログラムがとても判り易くなりました.
      ありがとうグローバル.

      ま、なんつうか、大域変数を変更するのは隠蔽しておくとしても、大域変数を参照するのは誰にでもできるというぐらいがちょうどいいです、わたしには.

      削除