Java入門・初心者質問スレ Part.4 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
>>283 設計段階で同じものだってわかってるなら何使ったってどうにでもなるわ! オブジェクト指向関係ない そのあとで実はここ違いますってなったとき IF文:分岐を入れる オブジェクト:ケースに応じて継承もしくは別クラス作成 コピペ:該当部分を修正 コピペが最優秀なんだけど その該当部分が鼠算で無限増殖していくのであっという間に手に負えなくなる コピペは死罪 そんなに増えないって 結合テストのケースに応じてコピペすりゃいいんだ どうせまとめたって機能別に試験させられるんだからそこがボトルネックのはず むしろ同じテストが完了した時点で 同じものがたくさんできているので生産性が高いといえよう 同じ記述はメンテ的に良くないので避けるべき、と習ったよ 修正箇所を少なく作るのが江戸っ子らしい ただそんな書き方は素人の俺には思いつかないのが問題 まとめたら単体まで作るときは楽なんよね… まとまってるぶん網羅しやすいからブラックボックステストの試験ケース少なくて済む でもIF文とか継承まみれになると可読性めっちゃさがる if文が増えるなら 業務分析が下手くそ 設計が下手くそ コーディングが下手くそ >>292 おまえは神か?世界の複雑さを完全に把握してコントロールできるのか? 彡 ⌒ ミ 彡 ⌒ ミ ( ´・ω・) ( ´・ω・) _(__つ/ ̄ ̄ ̄/つ/ ̄ ̄ ̄/ \/ / \/ /  ̄ ̄ ̄ カタカタ ̄ ̄ 彡 ⌒ ミ 彡 ⌒ ミ ( ´・ω・) .(・ω・` )ヾ < なぁ、これって _(__つ/ ̄ ̄ ̄/つ/ ̄ ̄ ̄/ \/ / \/ /  ̄ ̄ ̄  ̄ ̄ ̄ 彡 ⌒ ミ 彡 ⌒ ミ ( ´・ω) .(・ω・` ) _(__つ/ ̄ ̄ ̄/つ/ ̄ ̄ ̄/ \/ / \/ /  ̄ ̄ ̄  ̄ ̄ ̄ 彡 ⌒ ミ .彡 ⌒ ミ (´・ω・`) (´・ω・`) また、かみの話してる _(__つ/ ̄ ̄ ̄/つ/ ̄ ̄ ̄/ \/ / \/ /  ̄ ̄ ̄  ̄ ̄ ̄ >>286 仕様と1対1にできるのがオブジェクト指向のいいとこだろう 言ってることが真なら設計に戻るだけ コードだけ変えてメンテできなくなるのは初心者が陥りがちな罠 >>289 それむしろ逆。共通化してしまうと仕様変更で別々になる可能性がある。 共通化は本当に共通化したい部分にすべきことであって、何でもかんでも共通化は間違い。 いまどきJavaでオブジェクト指向にこだわっているのは考え方が古い。 業務系はオブジェクト指向と相性いいからな 趣味とかは知らん ビット演算について教えて下さい。 ビット演算子(&,|, ^)の右側と左側で桁数が違うときは、どういう処理がされるのですか? >>302 データベースとのやりとりは結局、解決してないけどな。 >>303 例えば、8・16ビットで、ビット演算して、何ビットの結果が必要なんだ? 少ない方の結果が必要なら、多い方を、少ないビットに変換すればいいし、 多い方の結果が必要なら、少ない方を、多いビットに変換すればいい 多いビット・少ないビットの、変換関数を探すか、自分で作ればいい >>305 やりたいことは符号無しintをlongに型変換したいのです。 どこかのサイトを見たところ、 longNumber = unsignedInt & 0x00000000FFFFFFFF とすればいいらしいのですが、 そもそも桁違いでビット演算したらどうなるんだ?というのが気になりまして。 小さい方を大きいほうの型にキャストしてるのか、 それともキャストしてるんじゃなくて桁を増やしてるのか… 桁増やすにしても、符号拡張してるのか、0で埋めてるだけなのか… 気になって夜も眠れますん。 >>306 目的に対してどうしてそういう手段でやっているのか? >>306 Chapter 15. Expressions https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.22.1 | | 15.22.1。 整数ビット演算子&、^、| | オペランドに対してバイナリ数値昇格が最初に実行されます。 | | 5.6.2。バイナリ数値昇格 | いずれかのオペランドがdouble型であれば、他方はdouble型に変換されます。 | それ以外の場合、どちらかのオペランドがfloat型であれば、もう一方はfloat型に変換されます。 | それ以外の場合、どちらかのオペランドがlong型であれば、他方はlong型に変換されます。 | それ以外の場合、両方のオペランドがint型に変換されます。 ということなので今回の場合はlong型に変換されるはずよ > longNumber = unsignedInt & 0x00000000FFFFFFFF これは末尾にLをつけないとlongにならないかと > int unsignedInt = -1; > long longNumber = unsignedInt & 0xFFFFFFFFL; 上をコンパイルして逆コンパイルしたら下になった > int unsignedInt = -1; > long longNumber = (long)unsignedInt & 4294967295L; なので型の変換はキャストっすね Java 8ならInteger.toUnsignedLongというメソッドが用意されてるので そっちが良いかも 型違いって言うのが、典型的なバグの条件 MISRA-C などでは、バグを防ぐために、 元から、型が異なるものを演算してはいけないというルール 「A 演算子 B」と書く場合、A, B は絶対に同じ型である必要がある だから、この式の前に、絶対に同じ型にしているから、 型変換のルールに、疑問など生じない >>308 に書いているような型変換のルールを、探してきて見直すような、 暗黙の型変換というのは、すごく単純な場合を除き、使わない方がいい 机上デバッグで、毎回、型変換のルールを見直して、 あれこれ議論しないといけないから面倒 しかも、開発メンバーが変わるたびに、説明・確認しないといけない 基本的に、言語仕様書を引っ張りだして、確認するようなものはダメ。 言語仕様書が必要な、コーディングをしてはいけない。 言語仕様書を見ない人もいるし、バグるだけ C言語はJavaより型付けが弱いんじゃないかな ブーリアンもないし C言語には継承やクラスといった概念がないからね、比較すべきはC++ >>308 完璧な回答ありがとうございます。 私の知りたかったこと全てと、私の知らなかったことが入ってました。 L付けておきます。 残念なことに、java1.7なのです。androidなもので。 >>309 はーい。あざーっす。 オペランドの片側に(long)付けておきます。 今日からjavaはじめる よろしくおまいら 初心者レベルだけどC言語から入ってjavaはじめるんだけど文字列結合とかキャストとか省略が許されててむずむずするわ 実装者が楽になる言語仕様がバージョンアップのなびに追加されるから このせいで理解してない人が書いたクソコードが万延する諸刃の剣になってる >>316 本来の書き方をわかってて省略するのとそういうもんだと思って書くのとでは雲泥の差があるな booleanとBooleanが混在しまくってるコード見たときには気が狂いそうになった >>318 それだけじゃクソコードエピソードとしては弱いなぁ >>320 いきなりメソッドの初めで戻り値を変数に設定して、メソッド内で上書かずに最後でreturn。 Java最大の失敗はBean これのせいで日本企業の所有するコードはパブリックアクセサだらけの地獄になった >>322 変更があった時に、その変数を弄べばいいだけになるから 割と良いと思うけど 逆の変更があったからあなたが見た状態になったのかも知れないし >>324 あなたの解釈だとコーディングミスを想定していない。 超初心者ですまん メソッドを数値で分けて呼び出したいんだけど 今使ってるのがswitchでの分岐 int a; switch(a){ case 1: hoge(); break; case 2: hogee(); break; } みたいな もっと効率の良いやり方があったら教えて欲しい >>326 幾つぐらい分岐するのかな?少ない場合はそっちの方が速いような気がするが。 分岐が沢山あるとか増え続ける可能性があるとか使う側で自由にセットしたいとかいう場合はまずinterface作っておいてその中にメソッドの定義を書いておく。 次にそれをimplementしたクラスを必要なだけ作っておき、HashMapにキーと共にインスタンスを入れておく。 後はそのHashMapからキーを使ってget()してメソッド呼ぶだけ。 c言語の入門書が一通り終わってオブジェクト指向も触りたくなったんでお勧めの入門書教えて下さい (´・ω・`)あのー すべての文字列はStringクラスのインスタンスとしてあつかわれるっていう表現がうまくイメージできないの じぶんなりにまとめたのは String s = "こんにちは" これは String s = new String(こんにちは) と同じでStringクラスをインスタンス化するときに、コンストラクタに対して引数としてこんにちはをわたしてる そしてインスタンス化されたStringクラスのメンバ変数にこんにちはが代入された 同じようにすべての文字列は扱われるので、 すべての文字列はStringクラスのインスタンスとしてあつかわれると表現される このイメージでいいの? くわしいひとおしえてくれませんか? >>329 Stringはよく使うクラスだから、特別な表記があるだけ。 >>328 この本で、オブジェクト指向を学ぶ スッキリわかる Java入門 第2版、2014 >>325 可能性を上げてるだけなのに想定って 君の思う一番のコーディング以外は全てミスってことか? >>334 ダメな例だよ。 変数が変数たる存在を理解してない。 >>335 変数が理解するのかよw 説明できないなら自分ルールにとどめときな >>337 それが日本語だとすると 変数が理解してない というように解釈できるぞ 正しい文章とは、誤解の余地がない文章だろう そんなこといいから、そういったコーディングをした時に発生し得る問題を挙げろよ 普通なら「変数が変数たる理由を理解してない」っていうわな まあ普通の人は各自で補って、それを論ったりはしないだろうけど あー定数やfinalでいいじゃんってことか finalじゃないから>>324 なんだろ 現場でやってれば、そういう問題集解いただけの発想だけでは居られない private staticメソッドを使う意味ってありますか? オーバーロードしたpublic staticメソッドの受け先以外の使い方で >>341 staticメンバにしかアクセスしないprivateなメソッドはprivate staticで定義するんじゃないの long x x = Integer.parseInt(str.substring(121,131)) 文字列の一部から10桁のlong型の数値を取得しているのだけど この取り出したい数値が大きい時に、 x=0 になってしまう不具合があるのだけどどうすればいいでしょうか スッキリわかるjava入門を電子書籍で読んでいるのですがラッパーの記述が何処にあるかわからないです 書籍をお持ちの方教えて頂けないでしょうか? >>347 ちょっと待て おまえの本には巻末に索引が付いてないのか? >>348 ありがとうございます! 電子書籍なので気付かなかったです! 電子書籍なら何も考えずそのまま検索すれば良いだけのような? 電子書籍っていっても文字で情報を持ってるわけじゃないから検索はできない(普通に索引はある) 静的初期化ブロックでif文使ってるようなクラスのカバレッジを100%にすることって出来ますか? >>354 のようなのを見ると、どうして初心者は言葉足らずが多いのかと、いつも思うよ。 メソッドを作成し、呼び出せコリャ メソッド名は命名規則にのっとって自由に決めてちょ。 値を定義済みの整数配列型と、整数型の値a, b を引数に渡して呼び出すと添え字 a の位置に b の値を挿入し整形済みの配列を戻り値として返すただし、元のデータは失われない ただし、配列の長さは変化してよし。 自炊してもスキャンした画像をOCRソフトに読ませてテキスト作らせて画像と一緒にPDFファイルに組み込む事は可能。 >>354 君の言っていることの意味がわからない。 >>356 ヒントだけ書いとこう。 1. 配列を List に入れる。 2. add()で途中に挿入。 3. 配列にして返す。 >>354 無理です リファクタリングしてからテストしてください >>356 public static void main(String[] args) { int[] src = {0, 1, 2}; for (int i = 0; i < 4; i++) { int[] dest = insert(src, i, 3); System.out.println(Arrays.toString(dest)); } } static int[] insert(int[] src, int index, int value) { int[] dest = new int[src.length + 1]; System.arraycopy(src, 0, dest, 0, index); dest[index] = value; System.arraycopy(src, index, dest, index + 1, src.length - index); return dest; } 低レベルスレは宿題ばっかやるアホが多くてホント呆れるわ チラシの裏でやれドアホ >>354 System.loadLibraryを特権計算か何かで呼んでるんだろうけどまずカバレッジ100%目指すってのがおかしい 言葉足らずとは思わないが >>365 やめたれ まぁ確かに人に質問する態度ではないけど プログラミング超初心者です Androidのアプリを作ることを目標にしてプログラミングを始めました とりあえずプロゲートでJavaの文法を一通り学び終えたんですが、これからどのように勉強を進めていけば良いのかいまいちわかりません フレームワークの勉強をした方がいいみたいなんですが、中々敷居が高くてどこからてを着ければ良いのやら、、 助言いただけると幸いです >>372 Androidの開発環境についてるサンプルアプリ動かしてそれ改造したりくっつけてきゃいいよ 設計学びたいなら本読め スレッドセーフについて教えて下さい。 よくフィールド変数は他スレッドから値が参照されたり、書き換えられたりするから、 使ってはいけない旨の記述を目にします。 例えば class Calc{ private CalcSub calcSub; public int execute(int param,int param2){ calcSub = new calcSub(); return calcSub.multiple(param,param2); } } このようにメソッド内だけでCalcSubクラスをインスタンス化したときも、危ないのでしょうか。 メソッド内の変数はスレッドセーフと聞きますが。 呼び出すたびに新しいインスタンスを生成しても危ないのですか? 上記の場合、フィールドに無理やり変数を持つ意味はありませんが、 よくフレームワーク等だとフィールドに変数とアノテーションで宣言しているのを見かけたので その場合はなぜスレッドセーフで、上記のような場合はそうじゃない(?)のか気になったで質問しました。 よろしくお願いします。 2, 30年やっていないと、マルチスレッド・プログラミングは出来ない 作っても、何十回に1回は、妙な動きをするから、使えない しかも、たちが悪いことに、たいていは正常に動くから、 テストで発見できず、本番環境でバグる >>375 実際発生するかは確認してないが考え方として スレッドαが新しいインスタンスaを作りメンバ変数に代入 スレッドβが新しいインスタンスbを作りメンバ変数に代入 スレッドαがメンバ変数からインスタンスb(あれあれー)を取得しメソッドをコール スレッドβがメンバ変数からインスタンスbを取得しメソッドをコール この場合はスレッドαがメソッドを終了するまでスレッドβがコールを待てば発生しないねsynchronized またはメソッドローカルな変数だとαとβが格納する先がそれぞれ別だから上書きされない だと思う >>377 ServletやAndroidはマルチスレッドでは マルチスレッドの物は、相互には呼べない。 呼べたら、バグだらけになるから大変 相手のキューに投入できるだけ。 それを相手が、自分のタイミングで、拾って処理する 間接的な通信方式だけが認められる。 直接通信はできない。 直接通信すると、バグるだけ >>381 まあまあ君、そんなに興奮しないでください jdk9に入ると言われてた型推論valって見送られたの? >>375 それでダメになるとしたら CalcSub が static のクラス変数を持っていて呼び出した処理の中でマルチスレッドを考慮せずにアクセスする場合だな。 >>375 直接の答えになってないけど、 わりと大雑把にデザインしていくしかないと思う 〜複数のスレッドからアクセスされるオブジェクトはこれで そん中のメソッドがそれぞれ排他されている〜 こまかく排他や相互作用が入り組んでくると んなもんはどうなってしまうか火を見るより明らか 排他処理のデザインを先にシンプルにかっちり作っといて あとはそれだけを触らせる まぁどうせ、どうしたってあとから徐々に複雑になっては来るんだけど… ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる