【Kotlin】バッキング・フィールド/プロパティ

フィールド

Fields cannot be declared directly in Kotlin classes.
Kotlin クラスでは、直接にフィールドを宣言することはできません。

プロパティ


// Kotlin
class Human {
    val age = 20
}


// Java
public final class Human {
   private final int age = 20;

   public final int getAge() {
      return this.age;
   }
}

バッキング・フィールド

ゲッターやセッターにカスタムロジックを入れたい場合は、「バッキング・フィールド」を使うことができます。

カスタムゲッターやセッターのスコープ内で「field」にアクセスできます。


// Kotlin
var counter = 0
    set(value) {
        if (value >= 0) field = value
    }


// Kotlin
class Human {
    val age = 20
        get() {
            println("Age is: $field")
            return field
        }
}


// Java
public final class Human {
   private final int age = 20;

   public final int getAge() {
      String var1 = "Age is: " + this.age;
      System.out.println(var1);
      return this.age;
   }
}

バッキング・プロパティ

ゲッターやセッターの外でフィールドに直接アクセスしたいときなどに使います。

private なフィールドに_を付けて明示します。


// Kotlin
private var _table: Map<String, Int>? = null
public val table: Map<String, Int>
    get() {
        if (_table == null) {
            _table = HashMap() // Type parameters are inferred
        }
        return _table ?: throw AssertionError("Set to null by another thread")
    }


// Kotlin
class Human {
    private val _age: Int = 20
    val age: Int
        get() {
            return _age
        }

     val printAge = {
         println("Age is: $_age")
     }
}


// Java
public final class Human {
   private final int _age = 20;
   @NotNull
   private final Function0 printAge = (Function0)(new Function0() {
      public Object invoke() {
         this.invoke();
         return Unit.INSTANCE;
      }

      public final void invoke() {
         String var1 = "Age is: " + Human.this._age;
         System.out.println(var1);
      }
   });

   public final int getAge() {
      return this._age;
   }

   @NotNull
   public final Function0 getPrintAge() {
      return this.printAge;
   }
}

まとめ

Java にデコンパイルした状況を確認しながら進むと理解しやすいように思います。

👉【Kotlin】Properties and Fields: Getters, Setters
👉 Properties and Fields: Getters, Setters, const, lateinit - Kotlin Programming Language
👉 Backing properties in Kotlin – ProAndroidDev
👉【MVVM】 ViewModel の_プロパティ記述


【MVVM】ViewModel インスタンスの取得

以下の記述ですが、


private val viewModel: MainViewModel by lazy {
  ViewModelProviders.of(this).get<MainViewModel>()
}

Activityで にしろ、Fragmentで にしろ、


private val viewModel: MainViewModel by viewModels()

でいける。

Fragment内で呼び出す場合は、


dependencies {
  implementation 'androidx.fragment:fragment-ktx:1.1.0-alpha08'
}

で、今現在。

コードをみてみる。


@MainThread
inline fun <reified VM : ViewModel> Fragment.viewModels(
    noinline ownerProducer: () -> ViewModelStoreOwner = { this },
    noinline factoryProducer: (() -> Factory)? = null
) = createViewModelLazy(VM::class, { ownerProducer().viewModelStore }, factoryProducer)

@MainThread
inline fun <reified VM : ViewModel> Fragment.activityViewModels(
    noinline factoryProducer: (() -> Factory)? = null
) = createViewModelLazy(VM::class, { requireActivity().viewModelStore }, factoryProducer)

@MainThread
fun <VM : ViewModel> Fragment.createViewModelLazy(
    viewModelClass: KClass<VM>,
    storeProducer: () -> ViewModelStore,
    factoryProducer: (() -> Factory)? = null
): Lazy<VM> {
    val factoryPromise = factoryProducer ?: {
        val application = activity?.application ?: throw IllegalStateException(
            "ViewModel can be accessed only when Fragment is attached"
        )
        AndroidViewModelFactory.getInstance(application)
    }
    return ViewModelLazy(viewModelClass, storeProducer, factoryPromise)
}

使ったほうが良いですよね。

はまらなくてすむ。

👉【MVVM】 ViewModel の_プロパティ記述

androidx.fragment.app  |  Android Developers


Kiwiブラウザでバックグラウンド再生

XDA Labs | Kiwi Browser

機能

- 高速
- バックグラウンド再生
- GDPR クッキー 自動受け入れ
- ブックマーク イン/エクスポート
- 通知ブロッカー
- マイニングブロッカー
- ポップアップブロッカー
- 広告ブロック
- ナイトモード

サブとしてだけでなくメインブラウザとしても使えます。

無駄を省いた高速サーフィンができます。

 

BANされた。

[Update: Restored] Kiwi Browser removed from Play Store due to YouTube background playback

Kiwi browser got removed from play store : Android

今現在は、復活しています。

Kiwi Browser - Fast & Quiet - Google Play のアプリ

各所で話題に挙げられてたように、YouTubeのバックグラウンド再生が原因だったようです。

復活後のインストール→起動直後の画面。

YouTube Prime の価値を損ねるようなアプリは認めないということでしょうか。

しかし、他にも見かけたことありません? そんなアプリ。

公式YouTubeAPI経由(有料)であれば問題ないということですかね。

 

まとめ

今現在、KiwiブラウザではYouTubeのバックグラウンド再生はPC版サイトのみ可能。


Pixel3 を買った人の正しい悔しがり方

「48,600円とか糞が!」と切れまくる糞な人々のためのエントリーです。

Google Pixel 3a - Google ストア

なんだかイラッとしますね、Pixel3を買った人々。

詳細を比較してみましょう。

価格半分のGoogle新スマホ Pixel 3aを Pixel 3と比較、意外な変更点

違うとこだけ。

項目 Pixel3a Pixel3
ディスプレイ o 5.6インチ x 5.5インチ
解像度 o 2220 x 1080 18.5:9 x 2160 x 1080 18:9
フロントカメラ x 8MP f/2.0 視野84° o 広角: 8MP f/2.2 視野97°
標準: 8MP f/1.8 視野75°
防水防塵 x IP52 o IP68
バッテリー容量 o 3000mAh x 2915mAh
ワイヤレス充電
(Qi)
x 非対応 o 対応
デザイン o ポリカーボネイト製ユニボディ x 背面ソフトタッチガラス
サイズ x 151.3 x 70.1 x 8.2 mm o 145.6 x 68.2 x 7.9 mm
価格 o 4万8600円 x 64GB:9万5000円

私的には、 Qi があるかないかで 46400円。

てか、フツーは、46400円 の損ぢゃねえの?、これ。

まとめ

Pixel3はおせっかいな機能満載で値段高過ぎでした。

くやしいのぅ。防水万歳!!

もうスマホの価格はここらで天井ですよね?

そら中国産の格安スマホが伸びますわ。

まあ、ベンチマークは、ダブルスコアだがね。

👉今なら「Pixel3a」より「Pixel3」を買ったほうが良くね?
👉 Antutu Benchmark of Google Pixel 3a
👉 Antutu Benchmark of Google Pixel 3
👉 Pixel3 の ワイヤレス充電 は Qiチャージャー で使えるのか?


Android Q beta3 で感じる Navigation Bar (ナビゲーションバー) の方向性

Android端末で、ナビゲーションバーが担当する操作は、以下の5つです。

- ホームへ (Home)
- アプリドロワー表示 (App drawer)
- アプリ切り替え (App switcher)
- 戻る (Back)
- アシスタントアプリ起動 (Assistant)

2019-05-05付で公開された Android Q beta3 では、


「設定」

  |

「システム」

  |

「操作」

  |

「System Navigation」

3タイプに分かれています。

それぞれ試してみましょう。

 

3-button navigation

これまでの、馴染みやすいレガシーなスタイルと言えるでしょう。



これが一番使いやすいと思う私は固執しすぎの保守な人間ですかね?

 

2-button navigation

実はこれが慣れると一番使えるのでは?



現在普及割合を増やしてる「Android P」 とはボタン数は同じだが、アプリ切り替えが少し違う。それがすごく良い。

 

Fully gestural navigation

問題なのはこれ。

今回、最新版の操作として登場してます。



「画面両端からの中向きスワイプ」が「戻る(バック)ボタン」という直感的でない操作に。

それ、各アプリ内ナビゲーションメニューやホームアプリなどと衝突しますし。

「薄っぺらい一つのボタン」を採用することにより、コンテンツスペースを縦方向最大限に確保できてるとはいえどうなんでしょうか。

 

まとめ

フルジェスチャーな1ボタンは辛くねえですか?




スペース空いてるんだし、2ボタンか3ボタンが馴染みやすいように思いますが、果たしてどうなるのか。

👉Android Pie から始まる「ナビゲーションバー」の混乱と操作の覚え方

👉Android Q Beta 3 hands-on: Dark theme, new gestures, and more! - Android Authority