final int を
FINAL
しやがれ!
WARNING!!!!
かなり個人的な偏見が入っています
また、オーバーに表現していたりします
お気を悪くしないでくださいね
自己紹介
長岡慶一
C/C++、Java、C#、VB、ASP、.NET系
Javaはあまり好きじゃないし詳しくないけど、
ラムダ・関数IF・StreamAPI・Enum・EnumMapはめっちゃ好き!
blog : gabekore.org/twitter : @boot_kt/facebook : boot_kt
今日、言いたい事
final int を使う理由は?
んなモン
無いわっ!!!
final int を使うヤツは
Java プログラマ じゃ無ぇ!
いや、
人間じゃねぇ!
よく見る final int
◆引数・戻り値に使用するパターン
private final int PATTERN_A = 1;
private final int PATTERN_B = 2;
private final int RET_OK = 0;
private final int RET_NG = -1;
private int doHoge(int pattern) {
/*
なんか処理する
*/
return RET_OK;
}
◆連番に使用するパターン
private final int RENBAN_NAME = 0;
private final int RENBAN_ADDR = 1;
private final int RENBAN_AGE = 2;
private final int RENBAN_TEL = 3;
・
・
・
アホですか!?
メソッドの引数や戻り値に
どのfinal intを使うかなんて、
分からへんやんけ!
使うのかどうかすらも分からん!
戻り値と引数に
final int を使う事で、
どんな 意味 が
生まれたって言うんだ!?
こんなもの
定数
とは言わない!
イミフな final int
private final int COL_1 = 0;
private final int COL_2 = 1;
private final int COL_3 = 2;
private final int ROW_1 = 0;
private final int ROW_2 = 1;
private final int ROW_3 = 2;
private final int ROW_NAME = 0;
private final int ROW_ADDR = 1;
private final int ROW_AGE = 2;
なぜ final int は
悪なのか?
問題:
どの定数をどのメソッドの何に使うでしょうか?
(引数? 戻り値? 処理の中?)
private final int AAA = 0;
private final int BBB = 1;
private final int CCC = 2;
private int functionHoge(int val) {}
private int functionFuga(int val) {}
private int functionBuga(int val) {}
ンなもん
分かるかボケッ!
この
「分からない」
というのが final int が持つ問題の一つ
定数とは?
「定数」とは
✓ どこで使うべきか分かる
✓ 想定すべき値の範囲が分かる
✓ 必要な情報が一つに集まっている
そして、コンパイラが保証してくれる
じゃ、何を使うの?
Enum
Enumなら、
値
メソッド
を一括りできる
そして、
型
になる
Enumのメリット1
連番
private eum COL {
NAME
, AGE
, TEL
;
}
void setData(COL col, String data) {
column(col.ordinal()).setText(data);
}
Effective Javaではordinal()を使うなと書いてますが、
テーブルの列とか順番が決まるものはordinal()の方が実用的
private eum COL {
NAME(0)
, AGE(1)
, TEL(3); // ←★こうやって連番書く方が面倒
private final int renban;
// コンストラクタ
private COL(int no) { this.renban = no; }
int getRenban() { return this.renban; }
}
Enumのメリット2
一括り
private eum TBL {
NAME(1, 1, (entity)->entity.getName, (entity,data)->entity.setName(data))
, TEL (2, 1, (entity)->entity.getTel, (entity,data)->entity.setTel(data) )
;
private final int col;
private final int row;
private final Function<?,?> getter;
private final int BiConsumer<?,?> setter;
// コンストラクタ
private TBL(int col, int row, Function<?,?> getter, BiConsumer<?,?> setter) {
this.col = col;
this.row = row;
・・・
}
・・・
Function<?, ?> getGetter() { return this.getter; }
BiConsumer<?, ?> getSetter() { return this.setter; }
}
Enumのメリット3
型
private enum RET { OK, NG; }
private enum COL { NAME, AGE, TEL, ADDR; }
private int functionHoge(int val) {}
private RET functionFuga(COL val) {}
private int functionBuga(int val) {}
Enumのメリット4
構造体
C言語経験者が
Javaに持つ不満
第1位
構造体が無い!
構造体の代わりに、こんなの書いていませんか?
「データ持つためだけに
クラス作るのメンドクセぇーー!」
と思っていませんか?
List<StructCls> structCls = Arrays.asList(
new StructCls(0, “名前”, true , 1)
, new StructCls(1, “電話”, true , 1)
, new StructCls(2, “住所”, true , 0)
, new StructCls(3, “年齢”, false, 1)
);
これが
Enum なら
できる!
まとめ
❌ final int にメリットは無い
✓ Enum なら、連番ができる
✓ Enum なら、情報が纏まる
✓ Enum なら、型になる
✓ Enum なら、構造体的に使える
⭕ コンパイラが保証する(これ重要!)
◆最後に言いたいこと
✓ ラムダ式
✓ 関数インターフェース
✓ StreamAPI
✓ Enum
✓ EnumMap
これらを全力で使え!
コードがアホほど大幅に変わる! マジでっ!
参考書籍
おしまい
gabekore.org/final-int-is-final

final int をFINAL しやがれ!