B-Teck!

お仕事からゲームまで幅広く

【Java】ImmutableなCollectionをJavaで扱う

finalの挙動

Javaのfinalは宣言した変数への代入を禁止するだけで、変数が持っているインスタンスの内容は変更できてしまう。 そのため、Collectionの追加や削除などの操作が行えてしまう。

変更できないCollectionを扱いたい場合、宣言と同時に初期化する インスタンスイニシャライザCollections.unmodifiableXXXメソッド を組み合わせて利用すると良い。

インスタンスイニシャライザ

インスタンスイニシャライザの仕組みを使うと、Collectionを宣言と同時に初期化できる

new ArrayList<String>() {{ add("one"); add("two"); }};
new HashMap<Integer, String>() {{ put(1, "one"); put(2, "two"); }};

操作できないCollectionを作る

java.util.Collectionsには各種Collectionの型に対応した読み取り専用化メソッドがある 各メソッドにCollectionを渡してやると変更不可のCollectionに変換でき、addやputを行うとUnsupportedOperationExceptionがthrowされる。 変換時にnullを渡すとNullPointerExceptionが発生するのでCollections.emptyList()を渡すようにするなど、取り扱いに注意。

また、一度unmodifiableすると変更可能なCollectionにリキャスト等行おうとしてもClassCastExceptionが発生してしまうので注意

unmodifiableCollection(Collection<? extends T> c)
unmodifiableList(List<? extends T> list)
unmodifiableMap(Map<? extends K,? extends V> m)
unmodifiableNavigableMap(NavigableMap<K,? extends V> m)
unmodifiableNavigableSet(NavigableSet<T> s)
unmodifiableSet(Set<? extends T> s)
unmodifiableSortedMap(SortedMap<K,? extends V> m)
unmodifiableSortedSet(SortedSet<T> s)

インスタンスイニシャライザと組み合わせ

static final List<String> list = Collections.unmodifiableList( new ArrayList<String>() {{ add("one"); add("two"); }} );
static final Map<Integer, String> map = Collections.unmodifiableMap(new HashMap<Integer, String>() {{ put(1, "one"); put(2, "two"); }} );

【雑記】2020年の目標 その1

昨年の1月に色々目標を立ててみたものの、一年間というスパンではやりたいことの変遷や仕事の立ち位置、触れる技術などが変わっており、全然役に立たないなと思ったので、1月から3ヶ月おきに目標を立てようと思いました。

達成できた目標、今後も継続するべきものについては次回に持ち越しつつ、定期的なむきなおりを挟むことで、年間の満足度をあげようという作戦です。

というわけで、1〜3月期の目標については下記を立てていこうと思います。

技術・アウトプット

  • 月2本以上ブログ更新(内容によらず、言語化・文字化を習慣づける)
  • 開発中のQRコード読み取り/作成アプリをストア公開まで持っていく
  • DDDを学ぶ(ブログに記事化できる位を目標)

生活の目標

  • 睡眠時間を平均7.5h以上にする
  • 社内の昼休みの運動に週3程度参加+帰宅後軽めのダンベル運動・プランク実施
  • 水分摂取リマインダー導入(1日1.7リットル目標)
  • 毎日最低8000歩を目標に歩く
  • 私生活も含めタスクはTodoistに記載、togglでトラッキングして無駄を洗い出す

まずは達成できそうな目標をベースに立ててみました。
色々周りの人にはお世話になることも多い一年になるかと思いますが、何卒よろしくおねがいします!

【雑記】2019年よかったものたち

あけましておめでとうございます。あけてしまいました。
ホントは年内に書こうと思ってたのに冬休み前からずっとデス・ストランディングしていたら冬休みどころか明けて一週間も経っていたんですよね。
そこから書き始めた記事なので、公開がこんなに遅くなっちゃいました。

さて、昨年も様々な作品に触れたり、ものを買ったりしたんですけど、個人的に買って・触れてよかったなと思うものをざっくり書いておこうと思います。

映画

実は映画を見るのが好きで、毎年結構な本数を見ています。
去年はちょうど50本でした。
その中でも年間で一番、というかともすればここ数年で見た映画の中でもっとも良かったと思ったのが、「search/サーチ」です。

Search/サーチ (吹替版)

Search/サーチ (吹替版)

  • 発売日: 2019/02/13
  • メディア: Prime Video

行方不明の娘の行方を探るため、ネット上の記録を追いかける父親がたどり着く真実とは…?というストーリー。
何を書いてもネタバレになってしまう気がするので詳細は語りませんが、サスペンス・スリラーなどが好きな人は是非見てほしい映画です。

ゲーム

結婚してからめっきりゲームやる頻度が減っちゃったんですが、2019年にプレイして久しぶりにドハマリしたゲームが下記2つです。

【PS4】Detroit: Become Human Value Selection

【PS4】Detroit: Become Human Value Selection

  • 作者:
  • 出版社/メーカー: ソニー・インタラクティブエンタテインメント
  • 発売日: 2018/11/21
  • メディア: Video Game
デトロイトのプレイ感はまさしく自分の選択肢によって変化する映画といった感じで、自分の決断・選択・思考が反映されて紡がれるストーリーは没入感が強かったです。
プレイしている間は正直寝食を忘れてプレイしてしまうほどでした。
【PS4】DEATH STRANDING

【PS4】DEATH STRANDING

  • 作者:
  • 出版社/メーカー: ソニー・インタラクティブエンタテインメント
  • 発売日: 2019/11/08
  • メディア: Video Game
デス・ストランディングは、コジプロはまさしく映画的なゲームを作りたいんだなぁという思想が強く感じられました。
リアルに描かれた地形や天候、キャラクターの動きによって様々な選択肢が生まれている配送ルートは、プレイヤーそれぞれだけのプレイ後感を残すことうけあいです。

こうしてみると、インタラクティブで映画的なゲームが好きなのかもしれないですね。
あまり自覚してなかった。

買ってよかったもの

エスケイジャパン Jaime 食器洗い乾燥機 工事不要 SDW-J5L

エスケイジャパン Jaime 食器洗い乾燥機 工事不要 SDW-J5L

  • 発売日: 2019/01/21
  • メディア: ホーム&キッチン
これは工事不要でキッチンに置くだけで洗える食洗機です。手頃な値段で、キッチンに置く場所確保するだけでよいのが最高でした。
手で給水してやらなきゃいけない面倒さはありますが、汚れも割とよく落ちて手洗いより全然楽なので、家事の手間が格段に減りました。

2019年に手に入れたあらゆるものの中で最高の買い物だったのがこれです。
運動や睡眠を計測するようになったことで、あまり意識できてなかった生活の改善に意識が向き、毎日歩くようにしたり、寝起きの時間をちゃんとするようにしたりできるようになってきました。 この値段なのに結構高機能で、↓のようなことができます。

歩数計
心拍計
スマホ通知
アラーム
座りすぎ通知
睡眠計測

GPSはついておらず、スマホと一緒に持ち歩かないとルート拾ってくれないのだけ、注意ですが。
22gくらいしか無く防水で、かなり電池を食う設定にしても1〜2週間は充電不要(充電自体も1時間程度で終わる)なので、文字通り24時間つけたまま生活をしています。
私はAndroidなので、この記事を参考に眠りの浅いタイミングで起きるようにしてみたところ、朝の寝ぼけもだいぶマシになりました。
まだアラーム音で朝起きてるの? Sleep as Android×スマートウォッチでスマートに目覚めよう | あすへん! 〜薙月の明日への変化〜

もし興味があるものがありましたらぜひお手にとって見てください!
今年もよろしくおねがいします!