Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
3
Help us understand the problem. What is going on with this article?
@wrongwrong

【Java】拡張for文、forEach文の変数をimmutableにする

More than 1 year has passed since last update.

普通に宣言した場合

拡張for文、forEach文を普通に宣言すると以下のようになります。
final宣言していないため、再代入可能です(普通のfor文は原理的に再代入が必須なので飛ばします)。

List<Integer> intList = Arrays.asList(1, 2, 3, 4);

for(int i : intList) {
    i = 0; // 書き換えられる
}

intList.forEach(it -> {
    it = 0; // 書き換えられる
});

この記事では、これらの内容を再代入不能な形に書き換えます。

変数をimmutableにする

拡張for文の場合

finalで宣言することでimmutableにできます。

for(final int i : intList) {
    i = 0; // final宣言しているため再代入不可でコンパイルエラー
}

forEach文の場合

以下のように、カッコで括って型を指定することで引数をfinalにできます。

intList.forEach((final int it) ->
    it = 0; // final宣言しているため再代入不可でコンパイルエラー
);

別解

一応ですが、無名クラスとして実装する場合も引数をfinalにできます。

Consumer<Integer> finalConsumer = new Consumer<Integer>() {
    @Override
    public void accept(final Integer it) {
        it = 0; // final宣言しているため再代入不可でコンパイルエラー
    }
};

お詫び

この記事は当初公開した際「インデックスをimmutableにできるのはfor文、拡張for文、forEach文の内拡張for文だけ」というタイトル・内容でしたが、@saka1029 様のご指摘の通り、これは誤りでしたので、タイトル・内容共に全面的に書き直しを行いました。

@saka1029 様、ご指摘ありがとうございました。

3
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
wrongwrong
リフレクションを用いたKotlin JVM向けのマッピングライブラリを作ってる人です。 スター募集中 -> https://github.com/ProjectMapK
microad
データとテクノロジーをかけ合わせたマーケティングプラットフォームを提供する会社です。

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
3
Help us understand the problem. What is going on with this article?