X(Twitter) Zenn GitHub RSS 共有

Javaも変数をデフォルトで不変にできないかなと思った話

作成日時:2023-02-05
更新日時:2024-02-05

Rustの “変数は標準で不変” という仕様が気に入った

変数と可変性 - The Rust Programming Language日本語版
https://doc.rust-jp.rs/book-ja/ch03-01-variables-and-mutability.html

Javaでもそういうことができそうなライブラリは無いかな~と思って探してみたが無さそう。

「自分で全ての変数にfinalつければいいだけじゃん」と言えばそうだが
そんなの可読性が下がるしコーディングも面倒なので、そういったものは自動でやってもらいたい。

なので、クラスにアノテーションをつけたら内部のローカル変数定義が全部final扱いになるライブラリを作る事にした。

ライブラリを作るにあたって、参考にLombok(アノテーションを使ってgetter/setterとかを自動生成するライブラリ) の中身を見てみた。

Lombokでそういうのが既に実装されてた

既にあるんかい。
検索の仕方が悪かったか。

不変のローカル変数はvalで変数定義。
https://projectlombok.org/features/val

2年前に実装されたっぽい。

Lombokはgetter/setterの自動付与ぐらいにしか使ってなかったが、結構いろいろなことができるのね。
https://projectlombok.org/features/

使い慣れたライブラリや言語でも定期的な再学習は必要だなあと思った。
というオチ。

再代入不可能性と言語仕様に関して

変数と可変性 - The Rust Programming Language日本語版
https://doc.rust-jp.rs/book-ja/ch03-01-variables-and-mutability.html
から引用

Rustでは、値が不変であると宣言したら、本当に変わらないことをコンパイラが担保してくれます。 つまり、コードを読み書きする際に、どこでどうやって値が変化しているかを追いかける必要がなくなります。 故にコードを通して正しいことを確認するのが簡単になるのです。

個人的に思ったこと箇条書き:

Foo foo = null;

(数百行のコード)

// 初めて初期化 + 使用。
foo = new Foo(); // 不変ならここでエラーになるので、使用する直前のここで変数定義をやらざるを得ない。
foo.method();