Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

システム内部の変数について

StrutsでWebアプリを作成していますが、
システム内部の変数をすべてStringにしたいという要望があります。フラグはBooleanのほうが実装しやすいと思うのですが、型変換の共通関数を用意すれば全ての型をStringにしても特に不具合はないと指摘されました。システム内部の変数をすべてStringするのはめずらしいことではないのでしょうか?何かデメリットがあれば教えてください。

6

回答

92802

閲覧

6件の回答

評価

0

マーフィーの法則で十分でしょ。

「失敗する可能性のあるものは失敗する」

共通関数を用いて変換するったって、
逆に言えば、いちいち変換しなきゃならない。
さらに、いちいち変換結果に合わせて、
いちいち適切なメソッドを選ばなきゃならないんでしょ?
出口を使い分けなきゃならないんだから、
ポリモーフィズムは役に立ちません。
事故の起こる余地なんか、十分すぎますよ。

そもそも、その動機を知りたいものです。
対象はプロパティファイルから取得する値で、
それがデフォルトでStringだから、だとか?

評価

0

言語はシステムを効率的に作るための道具なので、誰かの個人的な思いでそんなとこを制約するのは馬鹿げている。

…とは思うが、別にそれでシステムが「作れない」ということはないな。
コーティングもテストもデバッグも面倒だろうが。

booleanより、数値計算の方がアホらしい。
1を足すだけでいちいちparseしてString化か。

COBOLでcomp付けない数値項目は同じ意味だよ。
言語的に計算をサポートしてるし、COBOLで作れば?と考えてしまう。

評価

0

デメリット
・プリミティブに比べてメモリ効率が悪い
・型制約で静的に排除できるバグが入り込みやすい
・変換不能時の例外処理が常に必要
etc...

ただし、Struts1.x系の場合ActionFormの属性はStringのほうが良い場合もあります。
HttpServletRequest.getParameter()の戻り値がStringであるため、
属性にString以外の型を採用した場合、自動型変換がStruts側で行われますが
ここで、NumberFormatException等が発生した場合はリカバーできません。
(validateにたどり着く前にエラー)

この場合でもvalidate等のタイミングで好ましい型に変換してしまうほうが
以降の処理で扱いやすいと思いますが。

評価

0

if (StringToBoolean(flag1)
    && StringToBoolean(flag2)) {
  amount3 = LongToString(StringToLong(amount1)
    + StringToLong(amount2));
}
こんな事やりたいの?
1+2=12ってバグが怖すぎる

for (int row = 0; row < StringToInt(maxLines) ; row++)
これだと、毎回StringToIntが呼ばれるっけ?
コンパイラが最適化してループの最初にだけ変換してくれたりしないよね?

あと、数値文字列はintなのかlongなのか意識しながらコーディングする事になる?
longで収まる設計なのに、intに変換して計算しちゃいましたとか。

評価

0

>if (StringToBoolean(flag1)
私なら
if (isTrue(flag1)
かなー。どうでもいいが。

>コンパイラが最適化してループの最初にだけ変換し
てくれたりしないよね?
このケースなら実行時最適化で追い出されるかもしれない
が、最初からそれを期待したコーティングをするのもな。

評価

0

皆さん回答ありがとうございました。ユーザの要望の動機はStringでもプリミティブでも作業コストが全く同じだからという理由でしたが、やはりどう考えてもStringのほうが大きいですね。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。