LoginSignup
1
1

More than 5 years have passed since last update.

実体の無い Property を定義する

Posted at

という呼び名が正しいのか不明ですが。

はい

こういうことが出来ます。

object O {
    var x: String = "x"
    var y: String
    set(value: String) {
        privY = value
    }
    get() {
        return privY
    }
    private var privY: String = "y"
}

y の setter/getter 内で field を使っていないので、y に実体は無く実質 privY の setter/getter として機能させることが出来ます。実体が無いので初期値も不要です、というより set/get 内で field を使っていないので初期値が定義出来ないと言われます。賢い…。

何が嬉しいか

そもそもは Kotpref というライブラリを使おうとしており、これは README にあるようにシンプルな感じで Android の SharedPreferences を扱うことが出来ます。

ところで SharedPreferences の読み書きを行う前に処理を行いたい場合が出て来たんですが、Delegated Properties を用いている場合は自前の Setter/Getter が定義出来ず1、その為にメソッドを定義するのもイケてないので色々やってたらいい感じになりました。これは Base64 encode/decode をする例です。

object O: KotprefModel() {
    var b: Bitmap
    set(bitmap: Bitmap) {
        val bos = ByteArrayOutputStream()
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, bos)
        val byteArray = bos.toByteArray()
        realP = Base64.encodeToString(byteArray, Base64.DEFAULT)
    }
    get() {
        val byteArray = Base64.decode(realP, Base64.DEFAULT)
        return BitmapFactory.decodeByteArray(byteArray, 0, byteArray.size)
    }

    private var realB by stringPrefVar()
}
// // // //

O.b = Bitmap()
val bitmap: Bitmap = O.b

結局余分な Property が増えることにはなるので何を持って綺麗と言うかは好みが分かれると思いますが、set/get 内で field を使わない場合にいい感じに賢く解釈してくれたのが嬉しくて勢いで記事を書いたというのが本質です。あと独自メソッドを使わなくても Property ライクに参照、代入っぽく kotlin っぽく扱えるのがいいですね。

強い人達が適切な方法をコメントしてくれることを願って、この記事は以上とします。


  1. 多分やる方法がありそうなんですが見付けきれませんでした。 

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1