1 名前:デフォルトの名無しさん mailto:sage [2013/06/09(日) 20:27:10.93 ] プログラミング言語Javaに関する質問スレです。 JavaScript, Ajaxの質問は、ここでは受け付けていません。 Web製作管理 pc11.2ch.net/hp/ Webプログラミング pc11.2ch.net/php/ をご利用下さい。 よくある質問 ・「コマンドまたはファイル名が違います」 「'javac' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。」 「Exception in thread "main" java.lang.NoClassDefFoundError: 」 (p)ttp://www.wikiroom.com/java/?path,classpath ・String に == は使うな。equals() を使え。 ・「\12288 は不正な文字です。」 文字リテラル以外で全角スペースは使えません。半角スペースに。 ・その他の質問→「APIのjavadoc見ろ」 前スレッド ★★Java質問・相談スレッド161★★ toro.2ch.net/test/read.cgi/tech/1364006637/
321 名前:デフォルトの名無しさん mailto:sage [2013/06/27(木) 02:46:01.29 ] >>314 こういうのってキャストとかしなくて大丈夫なん?
322 名前:デフォルトの名無しさん mailto:sage [2013/06/27(木) 02:48:56.11 ] ArrayList (Java Platform SE 7) docs.oracle.com/javase/jp/7/api/java/util/ArrayList.html 通常、リストの同期をとるには、リストを自然にカプセル化するオブジェクトで同期をとります。 そのようなオブジェクトが存在しない場合は、Collections.synchronizedList メソッドを使用してリストを「ラップ」する必要があります。 これは、リストへの偶発的な非同期アクセスを防ぐために、作成時に行うのが最適です。 List list = Collections.synchronizedList(new ArrayList(...));
323 名前:デフォルトの名無しさん mailto:sage [2013/06/27(木) 03:07:49.08 ] >>322 マルチスレッドでadd()等の処理をするときに同期どれよというのはわかってけど まるで答えになってないよね?
324 名前:デフォルトの名無しさん mailto:sage [2013/06/27(木) 03:15:37.97 ] The List Interface (The Java? Tutorials > Collections > Interfaces) docs.oracle.com/javase/tutorial/collections/interfaces/list.html Here's a nondestructive form of this idiom, which produces a third List consisting of the second list appended to the first. List<Type> list3 = new ArrayList<Type>(list1); list3.addAll(list2);
325 名前:デフォルトの名無しさん mailto:sage [2013/06/27(木) 03:20:07.47 ] >>321 オブジェクト指向言語で抽象度の高い方向(スーパーセット)にキャストするのは問題ない ここら辺は個別に疑問を持つより基本を一通り知ってから考えた方がいいよ
326 名前:314 mailto:sage [2013/06/27(木) 03:41:15.24 ] >>324 そこじゃなくない?外国人が使っているよということを言いたいの?何が言いたいの? リンク先で、 同じオーダー中に同じ要素を含んだ二つのListが等しくなるってのはわかった。 で、equals書くならhashCodeも一緒に書けよっていう某本にも書いてるその辺にも強いことがわかった。 これが答え?
327 名前:デフォルトの名無しさん mailto:sage [2013/06/27(木) 06:21:34.84 ] 外国・・・そうかなぁ? 個人的には>>320 に同意。 例えば適切な抽象度のインターフェイスが別にあるのにArrayListとかHashMapと いった実装クラスを引数として要求したり返値として返したりする公開メソッド を持つクラスに出会った場合は、とりあえずその品質を疑ってかかる。 いわゆる「臭う」コードのよくあるパターンだと思う。 内部変数にしても例えばArrayList使って抽象度を下げるとListのような抽象度の 高い引数を受けにくくなるので、こちらも普通はListを使うかな。 ある場所での型の抽象度の低さはコード中の他の場所に伝染するんだよね。
328 名前:デフォルトの名無しさん mailto:sage [2013/06/27(木) 06:40:22.65 ] >>318 その理屈はおかしい JavaのListはランダムアクセスが効率的に行えることを保証しないので、 ランダムアクセスしたいならArrayListで受けなければならないということになってしまう いや意識してそういう理由でArrayListならそれでいいと思うけどね ジェネリクスでList,RandomAccessとする手もあるけど 内部でnewする変数にそこまでするのは現実的じゃないわな
329 名前:デフォルトの名無しさん mailto:sage [2013/06/27(木) 06:56:02.07 ] >>325 ただしそれはオーバーライドがない時の話な オーバーライドされたメソッドがある場合は派生クラスが厳密に規約を守っているか確認しなければ規定クラスとして使ってはいけない オーバーライドしているとたやすくis aの関係が破壊される 規約を作れば良いというがその規約にバグがないことも規約が守られてることも保証することは難しく人の注意力に頼るしかない だからバグが量産される た
330 名前:デフォルトの名無しさん mailto:sage [2013/06/27(木) 07:06:20.79 ] ListってまともにListIteratorで操作されてることは滅多にないよね ランダムアクセスのためのインターフェースとしなかったのはJavaの大失敗の一つ
331 名前:デフォルトの名無しさん mailto:sage [2013/06/27(木) 12:01:34.71 ] List をランダムアクセスにしたら LinkedList が List じゃなくなるじゃないですか 名前的に紛らわしい
332 名前:デフォルトの名無しさん mailto:sage [2013/06/27(木) 13:37:26.26 ] 予期せぬListの実装が引数に渡されたらどうなっちゃうの?
333 名前:デフォルトの名無しさん mailto:sage [2013/06/27(木) 14:51:40.48 ] java.util.RandomAccessに代入可能かどうかで判定するのが 業界の慣習。一応。
334 名前:デフォルトの名無しさん mailto:sage [2013/06/27(木) 15:20:23.50 ] String戻せば済むところをCharSequence返すメソッドは考えすぎだと思う。 メソッド引数としてはアリ
335 名前:デフォルトの名無しさん mailto:sage [2013/06/27(木) 21:25:21.75 ] >>334 Androidの真似して かっこいいと勘違いしたんだろ
336 名前:デフォルトの名無しさん mailto:sage [2013/06/27(木) 23:59:50.59 ] StringBuilder返すところでホントはAppendable返したいのだが IOExceptionがじゃまなの…
337 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 01:16:49.31 ] >>331 .NETはまさにそうなってるね 名前的には残念なことになってるが設計としてはアレが正解だわ
338 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 01:20:26.99 ] >>329 その話、アップキャスト関係なくね?
339 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 03:30:45.63 ] private int a; private int b; private int c; public Constructor(int a, int b) { this.a = a; this.b = b; // 引数a, bできまるcはこう書くべきなのか c = a+ b; // こう書くべきなのか、どっちがいいですか? c = this.a + this.b; // やはり前者? }
340 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 03:40:28.29 ] >>339 前者にすべき。マルチスレッドに対応させる際に後者だと都合が悪い
341 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 04:03:42.53 ] >>340 把握しました
342 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 04:14:49.32 ] 横レスだけど 後者だとどう都合が悪いの?
343 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 07:05:24.68 ] 問題ないよ
344 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 07:30:16.62 ] >>340 最悪な回答だな
345 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 07:33:43.35 ] どっちでもいいだろ コンストラクターが完了するまでは オブジェクトの構築が終わってないんだから 他のメソッドに合わせてthisを使う必要はない
346 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 08:59:23.11 ] >>342-345 マルチスレッドにした場合は初期化中のオブジェクトにアクセスされる可能性がある。つまり this.a = a; this.b = b; // ここでthis.aやthis.bの値が別スレッドから更新される可能性もある c = a+ b; その結果「引数a, bできまるc」という仕様が満たされないことになる c = a+ b;なら別スレッドから何かされても仕様は満たされるが、 c = this.a + this.b;にした場合は、初期化中のオブジェクトが外部に公開されて this.aやthis.bが変更される危険がないかConstructorクラス全体を調べなければならない どちらの方が安全にコーディングできるか考えれば答えは明らかだよね
347 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 10:30:31.07 ] >>346 Java言語仕様読み直せ
348 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 10:36:23.41 ] >>339 コメントに沿った実装という意味では前者だな。 意味的にも前者のほうがいいんじゃなかろうか、そのコード片だけでは判断できんけど。 結果はどっちも変わらん。
349 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 10:41:16.57 ] cが引数a,bから決まるのでなくメンバのa,bから決まる値の場合は・・?
350 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 10:48:00.80 ] どこで>>346 みたいな知識を仕入れたのか気になるんですが... 検証の仕方も思い浮かびません...
351 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 10:50:51.90 ] コンストラクタってスレッドセーフじゃないん?
352 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 10:51:08.41 ] >>349 その場合はそりゃ後者だろう。
353 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 10:52:26.29 ] The Java? Tutorials docs.oracle.com/javase/tutorial/ JAVA覚えようぜ
354 名前:デフォルトの名無しさん [2013/06/28(金) 11:37:29.87 ] >>346 の謎解きをするスレはここですか? >初期化中のオブジェクトが外部に公開 コンストラクタで外部にthis参照が逸出するときのことを言ってるんだろう。 ふつう、コンストラクタはthis参照を外部に公開しないように実装するものなんで、 そういう状況になること事態が実装上の不備だと思う。拙者そう思う。
355 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 12:26:37.11 ] コンストラクターがマルチスレッドって ただのコーディングミスだろ
356 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 12:43:30.30 ] >>354 でもそれだとマルチスレッド関係ないよな...
357 名前:354 [2013/06/28(金) 12:50:39.56 ] >>356 俺はマルチスレッドの話をしたつもりだったんだが、お前はなんで俺の話がマルチスレッドと関係ないと思うの?
358 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 13:15:22.64 ] double checked locking 問題ではコード読んだ時の直感に反して コンストラクタ完了前に参照漏洩してたりしたからなぁ。 あの手の問題あるとチェックしきれん。
359 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 14:28:50.08 ] >>357 シングルスレッドでも逸出させられる
360 名前:デフォルトの名無しさん [2013/06/28(金) 14:38:54.68 ] B木を実現するjavaプログラム、難しいけどわかる人いますか?
361 名前:桃白白 ◆9Jro6YFwm650 [2013/06/28(金) 14:45:17.44 ] >>360 桃白白わかるよ。
362 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 15:01:04.41 ] スレッドAが生成した新オブジェクトを ロック無しで確実にスレッドBに届ける方法は無く、 スレッドAがロックすれば確実に初期化された新オブジェクトが 全スレッド間で共有されてしまうので 正直 ど う で も い い
363 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 15:04:35.49 ] 自分も前者がいいな。10文字少ないので。
364 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 15:06:40.22 ] >>361 すみません、教えてください。
365 名前:桃白白 ◆9Jro6YFwm650 [2013/06/28(金) 15:09:21.89 ] >>364 B木のなにを知りたい?アルゴリズム?インプリメンテーション? 値を追加するところ?値を削除するところ?値を検索するところ? どのあたり?
366 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 15:15:09.70 ] >>350-351 TSM01-J. オブジェクトの構築時にthis参照を逸出させない https://www.jpcert.or.jp/java-rules/tsm01-j.html
367 名前:デフォルトの名無しさん [2013/06/28(金) 15:16:16.75 ] >>365 値の追加、検索、削除が出来ればOKです 初めに任意で最大の子の数を入力する所から始めたいです
368 名前:桃白白 ◆9Jro6YFwm650 [2013/06/28(金) 15:34:04.09 ] >>367 コード欲しいってことね。 桃白白もいくつかコード眺めてみたけど、奥村さんのコードが一番きれいだと思う。 『Javaによるアルゴリズム事典』サポートページ oku.edu.mie-u.ac.jp/~okumura/java-algo/
369 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 15:50:38.71 ] >>368 ここに置いてあるzipファイルの中の「BTree.java」ですよね? ありがとうございます!これを参考にします。
370 名前:桃白白 ◆9Jro6YFwm650 [2013/06/28(金) 15:55:43.37 ] >>369 はい、それです。
371 名前:デフォルトの名無しさん [2013/06/28(金) 20:15:07.51 ] JavaScriptは板違い ローカルルール読んでこいよ異常者共
372 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 20:39:57.59 ] 自作クラスの感想などを頂きたいのですが、スレ違いでしょうか?
373 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 20:42:02.65 ] 相談のうちには入る…のかなあ
374 名前:桃白白 ◆9Jro6YFwm650 [2013/06/28(金) 20:49:48.68 ] >>372 いんじゃないの。書いちゃいなよ。
375 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 21:26:55.04 ] >>374 自分のコードの感想言われたらファビョる奴が良く言うよ
376 名前:372 mailto:sage [2013/06/28(金) 21:27:03.75 ] ソースファイルが6つあるので、こちらにアップしていて遅くなりました。 ttp://sourceforge.jp/users/soremachi/pf/TokenTable/wiki/FrontPage/attach/tokenTable.zip コーディングを補助する目的で作った文字列テーブルです。2ヶ月ほど前にJavaの勉強も兼ねて作りました。 (「TableTest.java」にとりあえずの使い方が書いてあります)
377 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 21:32:12.78 ] おまいらIdeoneぐらい教えたれよ
378 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 21:32:33.32 ] sourceforgeねぇ
379 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 21:48:31.18 ] >>376 System.out.println( "Table file : ファイル名を指定してください" ); return false; のようなものは throw new IllegalArgumentException( "Table file : ファイル名を指定してください" ); のようにしておけ false 返しても結局戻り値チェックしないんだし、エラーを無視して実行を続けるより死ぬ方がいい 特別に理由があって死にたくないときは try catch すればいい
380 名前:372 mailto:sage [2013/06/28(金) 22:04:25.51 ] Ideoneにも上げました。Sourceforgeの方は消したいと思います。 ttp://ideone.com/IKjued ttp://ideone.com/1IQ5G5 ttp://ideone.com/zOJYVA ttp://ideone.com/7TUxdz ttp://ideone.com/1kuWqV ttp://ideone.com/9MOKz4 ttp://ideone.com/4QEy30
381 名前:デフォルトの名無しさん [2013/06/28(金) 22:08:09.94 ] ideoneやcodepadは英語サイトだから利用規約や制限事項や禁止事項がわからないし、利用料金や支払い方法もわからん
382 名前:372 mailto:sage [2013/06/28(金) 22:32:42.03 ] >>379 わかりました。 引数のチェックでは throw new IllegalArgumentException を使うのが一般的なんですか?
383 名前:デフォルトの名無しさん mailto:sage [2013/06/28(金) 23:49:28.98 ] メソッドのコメントに //- こういうの流行ってんの?
384 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 01:37:41.96 ] 一個目のファイルしかみてないけど、Javaな人はあれみて何も思わないの? 俺、すげー気持ち悪いんだけど。 setHead, setPrimary, set, file、全部キモい。 addとかappendとかkeyとかindexとかcolumnとかpush_backとかなんかそんな概念じゃないのか? まあ、かろうじてinsertはありなのかもしれないが。
385 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 01:42:53.74 ] あと、列データとかtokenとか、一体どこ経由でこのコードにたどり着いたんだ?
386 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 02:51:57.69 ] 突っ込みどころが多すぎる 列を追加してるのにsetHeadというメソッド addだろ 標準出力するだけのクラス tableを受け取るメソッドかtoStringに書けばいい トリッキーなgetterとsetter 座標指定で十分 同一パッケージから直接変更し放題のフィールド 大事な値をうっかり壊しちゃうかもよ 何でもpublicメソッド エラーメッセージとか外から呼び出すの? 別のクラスに投げるだけなら直接呼び出せ ファイルが閉じられない可能性がある Exceptionでキャッチすんな ...
387 名前:372 mailto:sage [2013/06/29(土) 03:00:41.42 ] >>384-385 insertは、なぜありなんでしょうか?Javaというか、オブジェクト指向に触れて3ヶ月ほどなので、 その概念というのがちょっとわからないです・・・。メソッドの持つ役割とかですか? 列データやtokenなどは、いい加減に書いてしまいました。 ArrayListを入れ子にしているので、行列のフィールドに対するコメント文です。
388 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 05:13:45.52 ] >>387 慣用的に使われる用語とその組み合わせというのがあって、大抵それは求めれば他のソフトウェア 技術や数学用語にちゃんと由来が見つかる。 例えばデータ構造として表(table)という名前を使うのであれば列(column)や属性(attribute)、 行(row)やタプル(tuple)という言葉と組で使うのが慣用的。これらの用語は関係データベースの 世界に由来の一端(全てではない)があって、この世界ではrelation・attribute・ tupleかtable・ column・rowの組で使う(厳密にはこの二つの組は異なる概念なので混ぜるのも良くない)。 あとPrimary、これも元々関係データベースから来た用語だけど、数ある候補キーの中から一つ を選んで主キー(primary key)とするのであって、PrimaryKeyならともかくPrimaryだけでは 意味をなしていない。無難なのはKeyColumnかな。 操作に関してもtableにinsertとはおぉDB的だなぁと思ったらsetと出てきてずっこける。 DB的にupdateとするとややずっこけ感は少ない気がする。 setHeadは三重の意味で良くない。一つは上記の通りheadという名前。二つ目は列の「追加」 なのにsetという用語を使っていること。最後にsetHeadというメソッド名はJava Beansの 規約でtableのheadプロパティの値をセットするメソッドに使う必要があること。
389 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 05:45:43.21 ] 要約:クラス設計がレビューされていないような品質
390 名前:384 mailto:sage [2013/06/29(土) 07:41:48.98 ] >>388 あまりにアレ過ぎて言語化できなかったんだけど、すっきりしたよ。ありがとう。 俺、Javaは初心者なんだけど、Javaな世界ではあんな感じが普通なのかと思ったよ。 誰も何も言わないから。
391 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 08:25:23.88 ] 名付け規約に準ずるのは当然だが、 あまりにしつこい社会主義のようだと、せっかくの創造性がつぶれる もともと日本人には発想性がある人が少ないのに、さらに減ってしまう ジャワみたいにばかみたいに長い名前をつけるのもどうかと思うがな コンパイル後も短いシンボルになってないので、実行時の翻訳にムダな時間がかかる処理系もあるだろう
392 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 08:58:37.24 ] 今のところコード品質に関する指摘は>>386 だけだな 他は識別子の名前についてガヤガヤ言ってるだけで特に耳を傾ける必要はない コーディング規約読めばそれで理解できる話だし
393 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 12:47:46.80 ] 包含関係がしっかりしていれば長い名前空間も苦にはならないが、そうなっていない StringとStringBufferの区別は本当に必要なのか、とか
394 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 12:52:19.11 ] なるほど、不変オブジェクトだけで十分、と。
395 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 12:56:03.85 ] 可変オブジェクトだけで十分、っていう意味かもしれないじゃない
396 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 14:25:16.00 ] >>392 名前超大事
397 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 15:39:30.97 ] >>396 チーム開発なのか個人開発なのか ライブラリとして提供するのか 色々シーンあるだろ。個人開発なのに名付け規則に神経すり減らすのはエネルギーの無駄
398 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 15:48:00.90 ] 名前に神経すり減らすんじゃなくて >>397 みたいな奴が妥当な名前を付けられないってだけ
399 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 16:56:30.39 ] 会社の歯車がプログラムの歯車をつくるような環境って事か それは自由がないわな かわいそうだな...
400 名前:372 mailto:sage [2013/06/29(土) 17:19:07.84 ] >>386 別のクラスに投げるだけなら、といのは、ファイル入出力や画面への出力は、 同じクラスにメソッドとして持たせるという意味合いで合ってますか? それとも、ひとつのJavaファイル内に複数のクラスを書くということでしょうか? 何でもpublicメソッドなのは、正直、アクセス修飾子の使い方をわかっていませんでした。
401 名前:372 mailto:sage [2013/06/29(土) 17:58:10.67 ] >>388 知りませんでした。メソッド名は (setHead -> add)、(setPrimary -> setKeyColumn)、(set -> update)、(get -> select) こういう風にすればいいですか?
402 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 17:59:31.16 ] > 正直、アクセス修飾子の使い方をわかっていませんでした ( ゚д゚ )
403 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 18:52:47.47 ] そもそも、コンセプトとして、いわゆるDBのテーブルを想定しているのか、Excelのシート、つまり 二次元のデータの入れ物を想定しているのかがわからない。 そういう意図を表明するという意味で、名前重要。
404 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 18:59:40.27 ] 命名規則に話が集中しているのはそこがあまりにタコだと実装のレビューをしようにも読む方が 無駄な努力を強いられて嫌になるから。Tableクラスだけでもなかなかの忍耐が必要。 一人で書き捨てするコードならともかく、人に読んで貰うなら命名規則や慣用は要尊重。 無知を言い訳したオリジナリティーの発揮は単に有害。初心者こそ模倣から始めるべき。 ・適切なクラス名やメソッド名が解らないのであれば既存のライブラリのAPIから似たような ことをしているクラスやメソッドの名前を探して真似をする。 ・適切なコメントの付け方が解らないのであれば既存のライブラリのソースコードを調べて (クラス名に.javaとつけてググればいくらでもヒットする)真似をする。JavaにはJavaDoc 形式というコメントの付け方が定義されていて、これ以外の独自コメント形式は単に迷惑。 ・適切な変数名が解らなければ既存のライブラリのソースコードを調べて(以下略) 解らなければまず調べよう。 初学者ほど何故か調べない、真似をしない、コンパイル時のエラーメッセージも読まない不思議。
405 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 19:03:01.06 ] クラス定義時の一般論として ・フィールドは基本private。さらにfinalに出来ないか検討する。Tableのtableなんかは finalに出来る。finalではないpublicは御法度。protectedも慎重に。 ・フィールドの型は特別な事情が無い限りHashMapといった実装クラス名よりもMapと いうインターフェイスを用いた方が一般的に設計の抽象度が上がって実装に柔軟性が出る。 ・データの重複はバグの温床なので避ける。例えばrow_no、row_sizeなんてフィールドが 用意されているけれども、table.size()等で代用できないか検討する。パフォーマンス? それは素直で安全な実装で大敗してから考えるべき。 ・特別な事情がない限りファイルIOは直接手作りしない。例えばTableクラスの場合は write(DataOutput out)、readFields(DataInput in)というDataInput、Outputを使って 読み書きするメソッドを用意するのがお薦め。これだけでTableクラスをファイルに保存 することも、ネット経由で投げることも、Hadoopでビックデータ解析(笑)にも使える。 あるいはJAXBやJacksonを使ってXMLやJSONへマッピングする方法を検討する。 続く。
406 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 19:05:40.12 ] Tableクラスに関するとりあえずのコメントとして ・カラムの型や名前をバラバラのMapで管理しているのはあまり良くない。素直にカラムの 定義を扱うTableの内部クラスを用意して、 public static class Column{public final int index; public final String name; public final String type;} これのリストをスキーマとして定義する。必要であればルックアップテーブルも。 private final List<Column> schema = new ArrayList<Column>(); private final Map<String, Column> nameToColumn = new HashMap ... スキーマ情報を提供する公開メソッドも用意すると親切だよね。 public List<Column> getSchema() {return Collections.unmodifiableList(schema);} public List<Column> getColumn(int index) {return schema.get(index);} public List<Column> getColumn(String name) {return nameToColumn,get(name);} ・検索結果に一個結果を追加する度にサイズを+1した配列を生成して内容を全件コピーする 凄いコードを見たような気がするのは気のせいだよね・・・素直に可変長であるList を使うべき。返値もListで良い。 ・for(int i...)ではなく拡張for構文を使ってくれた方が読みやすい ・・・この調子で書いていくとどうなるのだろう・・・
407 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 19:15:00.14 ] お前のレスを読むにもかなりの忍耐が必要
408 名前:372 mailto:sage [2013/06/29(土) 19:31:53.15 ] >>406 スキーマって何ですか?
409 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 19:56:44.17 ] 自分で調べてから質問しろ
410 名前:デフォルトの名無しさん [2013/06/29(土) 19:58:21.58 ] >>408 構造の定義のことでしょ。 >>406 のコードでは列情報のことっすね。いまTableにはこの列がありまっせーていう情報。
411 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 19:58:31.40 ] >>408 スキーマとは構造のこと。テーブルのスキーマはテーブルの構造のこと。 テーブルのスキーマは一般的には列の定義の集合で、個々の列は名前や型を持つ。 テーブルの構造をスキーマと呼ぶ一方で、具体的なデータが入ったテーブルその ものはインスタンスと呼ぶ。スキーマとインスタンスもDBの世界で使われる言葉。 なのでDBの素養のある人であればtable.getSchema()がカラム定義のリストを返す のは簡単に想像出来る。これが命名規約や慣用の強み。 ただschemaに関しては素直にcolumnList、getColumnListでも良いかもね。 というかこれ以上現状のコードをレビューをするのもしんどいので、一度自分で 色々調べ直して書き直したコードと共に出直してくれないかな。
412 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 20:05:52.52 ] どんな勉強したらこんなに酷くなるの? 参考にしたものがどうしようもないゴミか、372が変な方向に理解しちゃったの? ちょっとjavax.swing.table.DefaultTableModelを見てみなよ
413 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 22:07:32.53 ] どんなレスを期待してコードを見てくれと言ってるのかわからないが、メソッド名を言われた通りに変えればOK 的なレベルに達してないから。
414 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 22:20:15.32 ] 詳細設計書なんていらんだろ派がこの板には多いと思うが、こういうコードを見れば 必要な場合もあるということがわかるはず。
415 名前:デフォルトの名無しさん mailto:sage [2013/06/29(土) 22:34:56.88 ] >>414 こういうコードを見ても設計何ソレ なのがJAVAドカタの真髄
416 名前:デフォルトの名無しさん [2013/06/30(日) 00:49:17.69 ] Windowsで無料でJavaを勉強出来る開発環境を教えて下さい
417 名前:デフォルトの名無しさん mailto:sage [2013/06/30(日) 01:12:40.42 ] JDK + テキストエディタ
418 名前:デフォルトの名無しさん mailto:sage [2013/06/30(日) 01:23:16.55 ] いるんだよなこういうジジイ発想の奴が Eclipseと答えるのがまっとうな人間
419 名前:372 mailto:sage [2013/06/30(日) 02:14:52.38 ] みなさまのアドバイスを参考に書き直してみました ご指導よろしくお願いします mainクラス ideone.com/paGek6 Tableクラス ideone.com/vLUKre Columnクラス ideone.com/IdrclV
420 名前:デフォルトの名無しさん mailto:sage [2013/06/30(日) 02:20:15.16 ] >table.getAttribute(j) これはKUSOコード
421 名前:デフォルトの名無しさん mailto:sage [2013/06/30(日) 02:37:58.18 ] クソと言うなら理由も書け