質問: true) { SetData[ii + 5] |= (int) Math.pow(2, ik); // BitSet System.out.println("ii:" + ii + "ij:" + ik + "SetData:" + SetData[5 + ii]); } else { SetData[ii + 5] &= (byte) ~(byte) Math.pow(2, ik); // BitReset System.out.println("ii:" + ii + "ij:" + ik + "SetData:" + SetData[5 + ii]); } } } et[0].setText(String.format(" %02X ", Integer.valueOf(SetData[ii + 5]))); // 16進表示 } }); } ``` ### 補足情報(言語/FW/ツール等のバージョンなど) より詳細な情報
回答: 質問のしかた(およびコード内容)についての指摘をいくつか申し上げます。 ### (1)質問の仕方への指摘 自分の想像ですが、本件をQ&Aに出すのではなく同僚か先輩に相談する際の会話の流れは次のようになると思います。 Q1: 困ってます。 A1: どうしたの? Q2: CheckBoxとRadioButtonの状態を16進数にしたいのですが、困ってます。 A2: コードは? Q3: これです A3: で、何が困ってるの? Q4: 次の箇所でエラーが出るんです。 ``` ... for (int ij = 0; ij < 4; ij++) { rG[0].addView(rB[ij], new LinearLayout.LayoutParams(wc, wc)); inLinearLayout[0].addView(rG[0], new LinearLayout.LayoutParams(wc, wc)); rB[ij].setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { for (int ik = 0; ik < maxCkRow; ik++) { for (int ikk = 4; ikk < maxCkRow; ikk++) { String st = view.getTag().toString(); int ii = parseInt(st.substring(0, 1)); ik = parseInt(st.substring(1, 2)); //----- CheckBoxのON/OFFを数値化 if (rB[ij].isChecked() == true || cB[ii][ikk].isChecked() == true) { ^ ... ``` A4: どんなエラー? Q5: こういうエラーです > > 内部クラスから参照されるローカル変数は、finalまたは事実上のfinalである必要があります > > > A5: なるほど、ijはforループの制御変数だけど値が変化する変数だからfinalとはならないんだよ Q6: どうすればいいですか? A6: 参照したいijの値を持つようなfinalな変数を宣言し、その変数を使うといいよ ``` ... for (int ij = 0; ij < 4; ij++) { int finalIj = ij; // 一旦別の変数へ代入 ... rB[ij].setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { for (int ik = 0; ik < maxCkRow; ik++) { for (int ikk = 4; ikk < maxCkRow; ikk++) { ... if (rB[finalIj].isChecked() == true || cB[ii][ikk].isChecked() == true) { ^finalな変数を使うようにする ... ``` 面と向かって相談する際には相談を受ける方が問題解決に必要な事実で「質問者が明示していないこと」を逆に質問して引き出してくれますが、Q&Aサイトではこういうような会話は普通想定しません。解決に必要な情報は**質問者側がよく状況を整理した上で最初から質問文に残らず明記しておくことが何より重要**です。あなたはA1~A2までは想定してコードを明示するところまではやっておられますが、それでは不足だったと言わざるを得ません。A3以降についても当然想定しておくべきです。質問コメントに書きましたが、あなたにこの点が把握できていないことが問題と感じました。 ### (2)その他コードで気になった点 (2-1) getTag()は(本件の部分以外に使ってないなら)それを使わなくても実装ができる ここは質問者さんが困っている点かどうかはっきりしませんし前提が不明なのでなんとも言えませんが・・・getTagを用いる典型的なケースとは「同一のイベントハンドラーインスタンスを複数のViewへ設定する場合」ではないでしょうか?本件のコードでは「Viewごとにそれぞれ別のイベントハンドラーインスタンスを設定している」ためgetTagを介する制御は冗長に見えました。使う必要がなさそうなgetTagを用いておられる理由は(1)が遠因になっているようにも感じました) (2-2) Math.pow swordoneさんが指摘しておられる通りですが、Math.powを用いた実装はworseというよりはむしろworstに近いと思います。本件は入力も出力も2進数で誤差が生じない値のみを扱っているためたまたま期待どおりの結果が得られるかも知れませんが、「誤差の問題がないことを保証する」ためにはdoubleの誤差・Math.powの特性についてのかなりの知識が必要です。そのような難しい解法を選ぶよりは「誰でも正しいことが一目でわかる」整数演算(シフト演算)を用いるべきです。Math.powによる実装は例えば川を渡るのに橋の欄干を目をつぶって渡るにも似た危なっかしさを感じます。どうかすると川に落っこちてしまいますよ? (2-3) `if (式 == true)`は冗長 `if (式)`と書くのが普通と思います。 (2-4) String.formatの引数SetData[ii + 5]のboxingが冗長 つまり`Integer.valueOf(SetData[ii + 5])`は冗長で、直接`SetData[ii + 5]`と書くのが普通な気がします。