[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 01/06 12:55 / Filesize : 277 KB / Number-of Response : 985
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【初心者】Java質問・相談スレッド115【歓迎】



1 名前:Javaが初心者 mailto:sage [2008/05/12(月) 03:05:27 ]
プログラミング言語Javaに関する質問スレです。
JavaScript, Ajaxの質問は、ここでは受け付けていません。
Web製作管理    pc11.2ch.net/hp/
Webプログラミング pc11.2ch.net/php/
をご利用下さい。

よくある質問
・「コマンドまたはファイル名が違います」
 「'javac' は、内部コマンドまたは外部コマンド、
 操作可能なプログラムまたはバッチ ファイルとして認識されていません。」
 「Exception in thread "main" java.lang.NoClassDefFoundError: 」
 www.wikiroom.com/java/?path,classpath
・String に == は使うな。equals() を使え。
・「\12288 は不正な文字です。」
文字リテラル以外で全角スペースは使えません。半角スペースに。
・その他の質問→「APIのjavadoc見ろ」

前スレッド
【初心者】Java質問・相談スレッド114【大歓迎】
pc11.2ch.net/test/read.cgi/tech/1207385614/
次スレは>>990あたりで。

過去ログ、関連スレッド、よくある質問とその回答など、
質問をする前に、貴方が見なければならないサイトについての情報は、
下のwikiのページにまとめてあります。
www.wikiroom.com/java/

231 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 20:01:14 ]
rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/252.java

これをコンパイルしようとすると終盤でFigureTypeが見つけられないとでてしまいます
どこを修正・追加すればコンパイル可能になるでしょうか?

232 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 20:06:42 ]
>>226
むしろ最初からListではなくArrayListで考えれば充分で、Listとして考える必要もないような気がする。

>生成部分は仕方ないけどそれ以外をわざわざ List から ArrayList へ置き換えてやる
宣言と初期化は普通は同時に行うわけで、書き換える必要もないと思うけど?

233 名前:186 [2008/05/17(土) 20:13:31 ]
>>229

ボタン表示ができたのですが、ボタンとしての機能がなくなっていました!
コンストラクタでボタンをADDで貼り付けて、別スレッドでpaintで描画した結果、
addで貼り付けたボタンは結局うしろにいって、paintで描画したボタン(ボタンとしての機能なし)
が画面はじにでるだけでした!
こういうものなのでしょうか?

234 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 20:57:46 ]
そりゃ下のコンポーネントにボタン置いてその上のコンポーネントにボタンのグラフィック描画しただけだから
クリックしたイベントが伝達されてないだけだと思う。
設計が悪い。

235 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 21:01:08 ]
ボタンが押されたら押された状態を描画すればいい
バッファイメージを自分で作るってのはそういう事だよ。
ゲームなんだよね?
JButton使わずにパネル上のマウス位置とマウスイベントを拾ってボタンは画像にしたらどうだろう。

236 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 21:05:05 ]
>>232
それは順序が逆だ。使う側が必要とするのは本来はListという概念を実現している何かであって、その実現手段は知ったこっちゃない。
しかし、Listの実体を生成するためには、具体的なモノを明示的に指定する必要があって、諸々の取捨選択の結果としてArrayListを用いることになるわけだ。
だから、ListでなくArrayListを型として用いるということは、利用側が必要としているのは「Listを実現した何か」ではなく「ArrayListという実装」である、という意志の表明になる。


237 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 21:06:41 ]
>>232
まあ、どうでもいいんだけど

例えば、本来、ローカル変数で十分なところに(ループのイテレータとか)フィールドを割り当ててて、
 「できることが多いからいいじゃないか」
 「クラスの外からは隠蔽されているからいいじゃないか」
 「最初からフィールド変数で考えれば十分じゃないか」
と言われるくらい気持ち悪い(※)

ましてや、これを、
「イテレータにフィールド変数を使わないのは、半端な知識がマが書いた云々」
とか非難され始めたら、ちょっと一言いいたくなる。

(※)それぞれ、以下から脳内変換
 「ArrayList は List よりメソッドが多いからいいじゃないか」
 「外向けのメソッドをつくる場合に、List にすればいいじゃないか」
 「最初から ArrayList で考えれば十分じゃないか」


>>生成部分は仕方ないけどそれ以外をわざわざ List から ArrayList へ置き換えてやる
>宣言と初期化は普通は同時に行うわけで、書き換える必要もないと思うけど?

考えてみれば、仮引数とかに使うとかしなければ、そうそう必要ないねぇ。
でも、まあ、人間の頭の中では List を操作しているつもりなのに、
プログラムの中では操作している変数は ArrayList である
という剥離は気持ち悪い。プログラムは、人間が読むためのドキュメントであるべきなのだから。

238 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 21:45:36 ]
>>236
その理論でいくならば、すべてのクラスにおいて具体的なモノとインターフェイスは別々に考えなければならないともとれる。
現実ではListとして考える≒ArrayList、諸所の取捨選択なんてほとんどない。

メソッド内とかクラス内で閉じるものに対して、「使う側」を意識するんか?
実体をつくるのも使うのも自分だろ。
そりゃ外部とのインターフェイスとしてはListが望ましいけどね。

239 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 22:24:21 ]
まあどっちでもいいと思うのは確か
Listでも構わんし、ArrayListでも気持ち悪くもない。
>232も必要がないとしか言ってないわけでどっちでもいい的立場なんじゃね?



240 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 22:26:57 ]
>>238
> その理論でいくならば、すべてのクラスにおいて具体的なモノとインターフェイスは別々に考えなければならないともとれる。
ある意味yes. 実装レベルでclassとinterfaceに分離するか否かは、モノの性質、作業工数、管理工数などを考慮して決めるけど。
あと、「使う側」って言うのは「List/ArrayListを使用しているコード」のこと。
それから、「表明」する主語は「コードを書いた人」で、「表明」している先は「そのコードを読むモノ(人だけじゃなくコンパイラも含む)」のこと。
つまり、List でなく ArrayList と書いたなら、そのソースコードを書いた人はそれを読むモノに対して、「ここでは (List ではなく) ArrayList である必要があるのだ」と主張しているのに等しい。

241 名前:177 mailto:sage [2008/05/17(土) 22:46:21 ]
>>181
確かに詳細にいくだけならプライマリキーを渡せばいいのですが、
詳細からまた一覧に戻ってくる際に同じ条件で検索する必要があるので一覧画面が受け取ったパラメータをまるまる渡してやらなければいかんのです…

ユーザインターフェスはformとボタンを使用する事を考えています。
コードとしては

<table>
<% while(ResultSet.next()){ %>
<tr><td>-----テーブル内容-----</td><td><form action="URL" method="POST"><--hiddonいっぱいとsubmit--></form></tr>
<% } %>
というのが思いついてはいるのですが、それだと生成されるレコードごとにhiddonがたくさん書き込まれてしまうなぁと思いまして…bottunタグにパラメータを埋め込めたら便利なんだけどなぁと思っているのですが…


242 名前:177 mailto:sage [2008/05/17(土) 22:47:30 ]
hiddenのスペル間違えてる…お恥ずかしい…

243 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 22:54:05 ]
>>241
行ごとにformを作るな、ページに1つでいいだろ

どこまでも検索条件を持ちまわすのか?
検索条件が増えたとき困らないか?

なんでもセッションに値を突っ込むのは奨励されないが、2画面以上遷移して値を保持しなければならない場合、セッションに積んだ方がいい。

244 名前:デフォルトの名無しさん [2008/05/17(土) 23:04:57 ]
Webサービスのライブラリって、axis2とJAX-WSのどっちがお勧め?

axis2は今動かして(クライアントだけだけど)とりあえず動いた。
JAX-WSはJDK落とすのがかったるいのでまだ試してないw

ttp://homepage2.nifty.com/igat/igapyon/diary/2008/ig080116.html
の「いろいろ問題」ってーのは具体的にどのあたりなんでしょ?

245 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 23:09:08 ]
List と ArrayList だとわかりにくいかもしれないけど、
Map と Hashmap では、体感しやすい経験があった。

最初のソース:
マスタ取得部品みたいなクラスがあって、
Hashmap map = new Hashmap();
で定義されていて、この map オブジェクトを外部からさわれるようになっている。
当然、呼び側からは Hashmap 型でアクセスしていた。

後日、Map の一覧をソートされた状態で表示する必要が発生し、Treemap に変えたくなった。
けれども呼び側では、すべて Hashmap にしているため、呼び側を、結局 Map で
取得するよう、すべて書き換えた。

部品側は、Map map = new Treemap();
にしておしまい。

こういうことがあると、呼び出し側ではインターフェースで取得すべきと思うようになった。
List においても、後日データ量が増えた、チューニングの問題で、ArrayList から LinkedList に変えたくなった
ときに、呼び出し側は List にしておけば、部品側だけの修正ですむと思うのだけど。


246 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 23:09:29 ]
いがぴょんに聞けば良いじゃん。

ま、現状だと資料とか実装例とか豊富なaxis2でいいと思う。
チャレンジャーならばJAX-WS使ってみれば?

247 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 23:12:59 ]
>245
問題は「当然、呼び側からは HashMap 型でアクセスしていた」ところ

248 名前:244 [2008/05/17(土) 23:19:44 ]
>>246
おお、もうお返事がw
了解、さしあたりaxis2でもう少し掘り下げてみる。

いや、axis(1)のような、Wikipediaにまで載ってる明らかなダメがあるのかと思ってねw
>JAX-WS
ttp://ja.wikipedia.org/wiki/Apache_Axis

249 名前:245 mailto:sage [2008/05/17(土) 23:20:49 ]
>>247
その部品は、以下のようなメソッドが外部向けに定義されていた。

public Hashmap getMasterMap() { }

たしかにこのままでも、呼び側は Map map = HogeUtil.getMasterMap();
すればよかったんだけど、Javadoc に返却値の型が Hashmap と書かれていたので、
みんな Hashmap 型で取得していたよ。



250 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 23:25:23 ]
ちげーよw
× public HashMap getMasterMap() { }
○ public Map getMasterMap() { }
あとHashMapだよ、Hashmapはないわ

251 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 23:27:28 ]
>>244
xfire ( xfire.codehaus.org/ )
あるいは、後継の
CXF ( cxf.apache.org/ )

はどうだい?

xfire は使ってたけど、POJO を WebService 化するのがすごく楽だった。
(コード修正なし、xml 書くだけ)

まぁいまどきのデファクトという意味では、Axis2 でしょう。

252 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 23:37:28 ]
>>243
ページに一つでformにしたいんですが、複数のSubmitを作ったら全部のHiddenを渡してしまうのが…というのが悩みでして。
submitを押したときに特定のパラメータを渡す動作をsubmitの中に書ければいいのですが…

検索条件は検索結果と詳細の間だけで持ちまわす物です。

253 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 23:42:34 ]
普通は悩まない

254 名前:170 mailto:sage [2008/05/17(土) 23:49:21 ]
>>174-175
レスどうもありがとうございます。
より詳しく理解できました(とくに >>175 の前半)

いま、マルチスレッドとパフォーマンスについて勉強していて、
(Map のほうが今の仕事に必要なのですが、>>170 は、わかりやすくするために List で質問しました)

Hashtable - Hashmap - ConcurentHashMap
にたどりつきました。

CopyOnWriteArrayList も、同じ java.util.concurrent パッケージですが、
copyOnWriteArrayList の javadoc をみると、ArrayList のスレッドセーフなもの、とあります。

なんで CopyOn・・・なのかわからない。
CopyOnWriteArrayList は、変更時にコピーを作るとあるが、ふつうの ArrayList は、
そうじゃないときにもコピーを作るということ?
また、なぜ「変更時にコピーを作る」がスレッドセーフに寄与するのか?

255 名前:デフォルトの名無しさん [2008/05/17(土) 23:51:14 ]
やさしいJavaの本理解したら、会社で通用する?

256 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 23:51:46 ]
>>252
JavaScript使って問題ないなら、
・必要なパラメータはhiddenで1組分だけ用意する。
・submitボタンは使わない。
・onClickハンドラで、hiddenのパラメータを書き換えてsubmit。


257 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 23:52:16 ]
やさしいJavaの本理解したら、会社で通用しないことが理解できる

258 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 23:58:34 ]
>>256
なるほど、
<Button onClick="">をwhileの中に入れて、JavaScriptの関数の中でhiddenを書き換えて渡せばいいということですね。
関数の引数で書き換えるデータは渡せそうだし、あとはhiddenの書き換えをどう実現するかですね。もしくは関数の中でパラメータを渡す処理をしても同じ動作いけそうです。

この路線で調べながらやってみます。ありがとうございました。

259 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 00:07:00 ]
>>254
普通のArrayListは、サイズがキャパシティよりも増えるときにしかコピーはしない。
同じ配列を操作するので、複数のスレッドから同時にアクセスすると危険。

CopyOnWriteArrayListは、いかなる変更操作を行うときも元の配列のコピーを作ってそっちを操作し、最後に参照先を指し替える。
元の配列は決していじらずに捨て置くので、iteratorは変更操作に影響されず古いものを参照し続けることができるし、getなどの取得操作も影響を受けない。
変更操作同士は衝突することになるが、参照先の指し替えをAtomicReference#compareAndSetで実行し、失敗したら最初から(コピーを作るところから)やり直す、という方法でスレッドセーフを実現している。



260 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 00:14:05 ]
>>254
てか、その辺のクラスでスレッドセーフを保証するよりも、Mapを持つクラスを作ってそのクラスが同期制御を管理する方が良い。

どんだけ排他制御が利いたMapにしたところで、Mapの参照を公開してしまうと一気に制御が難しくなる。
逆にHashMapでもあるクラスから外に参照を渡さず、HashMapにアクセスする公開メソッドの同期とれば良い。
並行処理の話ならば新APIの件もあるから、Java並行処理プログラミングって本を読むと良いよ。

261 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 00:48:55 ]
Win98SEでjavaの勉強をしてるんだけど、コマンドプロンプトをもっと簡単に入力できるようにする設定方法を教えて
会社のPCだと「↑」キーで今まで入力したコマンドやファイル名を20個ぐらい出せるのに、家のPCだと会社と同じWin98SEなのにできない
「→」キーを押したら直前の入力だけなぞれるけど不便過ぎて困ってる

262 名前:170 mailto:sage [2008/05/18(日) 00:51:41 ]
レスどうもありがとうございます。
>>259 なるほど、 CopyOnWriteArrayList の仕組みとメリットが理解できました。
ということは、あるスレッド(A)が CopyOnWriteArrayList#iterator で
iteratorを取得し、それをずーっと保持するとしたら、別スレッド(B)が add() しても、
スレッド(A)が保持する iterator の中身は、スレッド(B)が add() する前の List の内容の
参照を持っているわけですね。なんか DB の分離レベルの話みたいだな。

>>260
Map ですが、実際の現場では Map オブジェクトをそのまま外部にさらすことは無いと思いますが、
(map = null で消されたらお終いだし)
・ラップするクラスを作り、map は private にする
・ラップするクラスには、put と get のメソッドを作る

このとき、map の実装を
・Hashtable にすると、get もロックがかかるので、
・HashMap にしておき、ラッパクラスの put メソッドは、内部で synchronized (myMap) { } ブロックで囲み、
 get メソッドは synchronized をつけなければ、取得時の同時並行性は確保できると思いました。
・でもこの場合、Map の実装を ConcurrentHashMap にして、put メソッドの synchronized を
 はずしても同じなのでは、と考えました。

多分その先は Java並行処理プログラミング を読め、って感じだと思うので、読んでみる事にします。
新APIとは、J2SE5 で導入された、java.util.concurrent.* のことですか?

263 名前:261 mailto:sage [2008/05/18(日) 01:21:29 ]
doskeyで自己解決できた
下らない質問すんませんでした

264 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 01:32:46 ]
>>260
>・ラップするクラスには、put と get のメソッドを作る 

putとgetだけを提供する場合、

>if ( list.contains(x) == false ) list.add(x); 

のような問題は相変わらず回避できないことに注意。
まぁ用途次第かもしれないので、わかってればかまわない。

>・HashMap にしておき、ラッパクラスの put メソッドは、内部で synchronized (myMap) { } ブロックで囲み、 
>get メソッドは synchronized をつけなければ、取得時の同時並行性は確保できると思いました。

それはだめ。
変更(put)中のデータを参照(get)すると不正な結果を得たり死んだりする可能性がある。
もっと不可解なことが起きる可能性もあるけど、詳細は件の本でも読んでください。
要するにgetにもsynchronizedは必要。

同期の対象がMap1個で済む状況なら、ConcurrentHashMapは便利。
2個以上のMapを同時に更新しなければならない場合とかには無力。

265 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 01:39:06 ]
>>262
やっぱり理解不足。
putもgetもsynchronized (myMap) { } にしておく、が正解。
getだからといってつけないと、痛い目にあう(ヒント:Atomic性)

>Map の実装を ConcurrentHashMap にする
正しいといえば正しい。
だけど、並行処理で品質を高めるには1箇所で必要最低限の同期を取るのがポイント。

例えばMapとなにか別の要素もあわせて同期を取りたいとする。
すると、Mapで同期をとってさらにラップクラスで同期を調整して・・・と複雑になる。
そんな場合は同期を取るクラスは1箇所にしたほうが楽。
また、全てのメソッドを同期を取る必要があるか?という点も重要。

とはいえ、そのような要素がなければ簡単に実現できるConcurrentHashMap を使うのは正しい(シンプルこそ正義)。


予断だが、外部にさらしてもmap = null では何の影響もないぞw
map.clear() 等はマズイのでオシマイには変わらないけど。

266 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 01:40:37 ]
もろに被ったな、読み比べて補完してくれw

267 名前:170 mailto:sage [2008/05/18(日) 01:51:25 ]
>>264-265
レスどうもありがとうございます。

理解したつもりが理解不足といわれて&レスの内容をみて、自分のレベルの低さを実感しました。

>>264 で、put だけを synchronized にしても、
ラッパクラスで contains() も提供した場合、contains() と put は同期化されないことを理解しました。

あと、get と put の atomic 性というのも理解しました(つもりです)

>>265 さんの、ロック処理はシンプルに、というのも、以前不必要に synchronized をつけまくって
パフォーマンスを落としたことがあるので実感したことがあります。
どこを同期化して、どこは不要化、というのが大切ですね。

今回の複数の Map をスレッドセーフに更新するというのは、DB の複数テーブルを更新する際に
どこからどこまでを transaction にするか、と似ています(マルチスレッドと同期化、とは違うけど)

もっと勉強します。



268 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 02:30:55 ]
>>267
>以前不必要に synchronized をつけまくってパフォーマンスを落としたことが

Java 6 からVMの改良でsynchronized自体のパフォーマンスが上がってるので、
もしかしたら許容範囲になってるかもしれない (なってないかもしれない)。
不必要なsynchronizedを付けないに越したことはないけれど、
必要なsynchronizedを付け忘れてバグるよりはマシ、と思う。
synchronizedを外す (あるいは付けずに済まそうと企む) ときは、慎重に。

269 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 06:19:04 ]
get で重要なのは(まあどっちも重要だが)原子性より可視性だろ。
VMの最適化で、まだ変数に入れてない値が既に他のスレッドから見えるとか、
そんな奇妙なことが起こりうる。

同期化によるパフォーマンスの劣化は、スレッド間の競合が起こる場合に著しい。
競合で生じるコンテキストスイッチのオーバヘッドは大きく
その場でオブジェクト100個作ってもお釣りが来る。
synchronized 自身は、それほど重くはない。

「Java並行処理プログラミング」は誤訳が酷いね。訳本はみんなそうなのかもしれないけど。
特に最後の happens-before の説明、なんじゃありゃ?
半順序を定義しているだけなのに、ご丁寧に余計な脳内補完をしてる。
意味の通じないロジックや日本語が書いてあったら、無視するか原本を見た方がいい。
英語ができるなら、原本を読んだ方がいいのは言うにあらず




270 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 09:43:02 ]
> 英語ができるなら、原本を読んだ方がいいのは言うにあらず

最後の一文が……

271 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 10:00:20 ]
翻訳が〜ってのは解らないでもないが、英語が読めてもスラスラと読める人間は少ないわけで。
非難するならお前が翻訳しろと。

272 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 11:57:09 ]
いや、普通の感想だろw
金出して買ったものが酷いもんだったら文句いう権利はある。

273 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 12:09:23 ]
>>267
もう辿り着いているかもしれないが、
スレッドセーフ性は「スレッドセーフか否か」と簡単に定義できるものじゃない。

Javaの理論と実践: スレッド・セーフの特性について
www.ibm.com/developerworks/jp/java/library/j-jtp09263/index.html
(ただいまメンテナンス中)


274 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 16:05:21 ]
Rubyで書かれたクラスを利用したいのですが、どうしたらよいでしょうか?

275 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 16:07:57 ]
>>274
っ JRuby

276 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 16:22:28 ]
JRubyの存在をすっかり忘れてました
とりあえずはなんとかなりそうです
ありがとうございました

277 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 20:32:59 ]
ttp://rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/254.java

このプログラムでどうしても線の描写だけ始点、挙動がおかしくなります
どこを変更すれば他の図形と同様にクリックした箇所を始点、ドラッグして話した場所を終点の線の描写になるでしょうか?

278 名前:デフォルトの名無しさん mailto:sage [2008/05/18(日) 20:42:25 ]
>>277
API docs をちゃんと読んでください。特に java.awt.Graphics を。

279 名前:170 mailto:sage [2008/05/19(月) 02:20:36 ]
>>268-273
レスどうもありがとうございます。
>>273 の URL とか、「Java並行処理プログラミング」を呼んで勉強します。

これまでのいただいた情報を理解するのに精一杯で、しばらくここに質問をする
ことはないと思いますが、ひとまずお礼させていただきます。



280 名前:デフォルトの名無しさん [2008/05/19(月) 07:51:52 ]
JAVAを勉強中の者です。
GUIを使ったサンプルコードで、
final JLabel label=new JLabel("");
というようにlabelやTextFieldにfinalとついているものがありました。
このfinalというのはどういう意味合いでくっついているんでしょうか?
フィールドにfinalが付いている場合は「変更できない」ということですよね。
私が見たサンプルコードだとfinalのついたlabelやTextFieldは表示内容を変更したりしているので、
「変更できない」というのとは違う意味でくっついてるのかなと思ったのですが・・・



281 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 07:55:44 ]
>>280
final ついてたら単に再代入不可能なだけ。
Mutableなオブジェクトなら状態は変更できる。

282 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 08:59:30 ]
>>280
final の上書き(再代入)はコンパイルエラーになるので、コーディングミスを減らせる。
メソッド引数やローカル変数にも適用でき、上書き禁止を明示することができる。
クラスやメソッドに適用しても、上書き禁止(継承禁止)の意味になる。

メソッド内で生成したクラスからの参照を保証する為に、当該ローカル変数を final にすることも。

283 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 11:38:06 ]
ぐち。
クラスをfinalにするとユニットテストが書きにくくて困る。


284 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 12:55:11 ]
そりゃそうだろうな

285 名前:デフォルトの名無しさん [2008/05/19(月) 13:11:07 ]
javaで作るゲームの本に、vistaでゲームを作るとき1/60秒に一回書き換える
ループを作ると誤差がでるから1/10秒で書き換えなさいとか書いてあるけど
1/10秒はカクカクして嫌なので、誤差を出ないように1/60秒で書き換えたいのです。
それなので、そのループを教えてください。

286 名前:280 mailto:sage [2008/05/19(月) 13:11:24 ]
>>281-283
レスありがとうございます。
代入と状態の変更をごっちゃにしてしまっていたということなんですね。
すっきりしました!
どうもありがとうございました。


287 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 17:09:58 ]
>>285は釣られていい餌?

288 名前:デフォルトの名無しさん mailto:sage [2008/05/19(月) 19:04:35 ]
腹が減っていたらどうぞ

289 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 01:54:09 ]
すみません。質問させてください。
コマンドプロンプト上でjavaファイルをコンパイルしようとしても
pathが通っていないらしく、処理ができません。
今設定しているpathを書かせていただきますので、
どなたかご教授下さい。お願いします。
pathです

C:\WINDOWS\system32;
C:\WINDOWS;
C:WINDOWS\System32\Wbem;
C:Program Files\pcdNavi\bin;
C:\Program Files\Common Files\Roxio Shared\DLLShared\;
C:\Program Files\Softex\OmniPass;
C:\Program Files\Fujitsu\sadata\fsaax;
C:\j2re1.4.2_17\bin

ちなみにローカルディスクCのProgram FilesのJavaの中に
jre1.6.0_05フォルダがあり、そのbinフォルダにもjava.exeが入っているのですが・・・。
これは何か関係あるのでしょうか?




290 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 02:12:10 ]
JRE=j2re1.4.2_17=jre1.6.0_05=実行
JDK=コンパイル+実行

291 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 02:39:27 ]
>>289
んむ。>>290の言うようにJDKへのパス通せ。
つかそういうJava以前のことは初心者用の本とかサイトに書いてないか?

292 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 02:42:25 ]
テンプレに誘導が書いてある

293 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 12:35:12 ]
すみません、質問お願いします。
今、JAVAの勉強でサーバとクライアントのプログラムを作っていて(クライアントからコマンドを送り、コマンドに応じてサーバから答えを返すプログラム)、
その中でサーバーから送られた文字列をクライアント側で表示する部分がどうしてもうまくいかず、原因がわからず困っています。
下記がおおまかなコードです(はしょりまくってますが)
・サーバ側
ServerSocket ss;
Socket s;
PrintWriter out;
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
out = new PrintWriter(s.getOutputStream(),true);
for(;;){
<ここにコマンドを受け取ってそれに応じた文字列を返すコードが入ります>
(例) out.println("aaaa\nbbbb\ncccc");
}


294 名前:デフォルトの名無しさん [2008/05/20(火) 12:35:33 ]
javaアプリのmainの変わりにjavaappletのinitにしても
appleが動きませんでした
どうしたら動くのか教えてください

295 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 12:35:41 ]

・クライアント側
Socket s;
BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream()));
〜〜〜〜〜〜〜〜〜〜〜〜〜
for(;;){
<ここにコマンドを入力してサーバへ送るコードが入ります>
String message;
while((message = in.readLine()) != null){
System.out.println(message);
}
}

クライアント側の、while文がうまくいかないみたいなんです。どうもnullになったら抜けるというのがだめみたいで、
例えば送られてくる文字列を2行にしておいてwhile文の条件を2回繰り返すというようにするときちんと文字列が2行出るのですが、
それを任意の行数にしたくて「 != null 」という条件にすると全部の行を表示した後になぜかクライアントが落ちてしまうのです。
質問がわかりにくかったらごめんなさい、何かわかる方がいましたら教えていただけないでしょうか。




296 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 12:41:08 ]
>>295
落ちてしまうって何か例外でも出てるの?
それ捕まえてスタックトレース表示してみれば?

297 名前:295 mailto:sage [2008/05/20(火) 12:51:01 ]
>>296
コマンドプロンプトでやってるんですが、落ちるっていうか全部の行を表示した後に何も表示されなくなるんです。
適当にキーを押しても一切反応せず、でもCtl-Cで終了すると何も表示されなくなったあとに入力したキーを実行しようとした形跡がバーッと表示されるんです。
・・・すみません、わかりにくいですね。こんな感じです。

C:\>java aaa
command : bbb
>>"ccc"
>>"ddd"

ここで本来なら再度command : と出るはずなのですがそれが出ず、ここで適当に「a」とか入力しても何も起こらず、
Ctl-Cを押すと

C:\>a
'a'は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチファイルとして認識されていません。

c:\>

となるんです。








298 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 12:55:12 ]
>>297
readLineで次のデータが送られてくるのをずっと待ってるだけでは?
サーバ側でSocketをcloseするかshutdownOutputすれば通信終了(EOF)になるのでreadLineがnullを返すはず

299 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 13:02:33 ]
ちなみに
while ((message = in.readLine()) != null)
でループするということはストリームが閉じられるまで繰り返すとい
うことだから、このwhileを抜けるともうinから読むことはできない。

コマンド-レスポンスを繰り返したいなら、このwhileでメッセージの終
了判定はできないよ。





300 名前:デフォルトの名無しさん [2008/05/20(火) 13:13:07 ]
javaアプリのmainの変わりにjavaappletのinitにしても
appleが動きませんでした
どうしたら動くのか教えてください

301 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 13:16:14 ]
javaアプリのmainの変わりにjavaappletのinitにしても
りんごが動くわけありません
りんごは手で持って動かしてください

302 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 13:16:53 ]
>>300
具体的に何をどう変更したのか書きなさい。
リンゴが動かないとは何なのか。


303 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 13:18:58 ]
www.hellohiro.com/socket.htm

304 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 13:19:26 ]
万有引力が働かない異世界だからです

305 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 13:20:37 ]
javaアプリのmainの変わりにjavaappletのinitにしても
appletが動きませんでした
どうしたら動くのか教えてください

306 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 13:27:07 ]
>>305
アプリとアプレットは別物なので、mainをinitに変えただけで動くわけはない
アプレットとして動くように作られていないのなら、アプレットとして動くように最初から作り直す必要があるかもしれない

307 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 13:29:04 ]
>>300
アプレットをアプリケーションとして動作させたいってことなら
initはあくまでも初期化処理のみ
メインの動作はstartで行うようにオーバーライドされていることが多いので
インスタンスの生成→コンテナに追加→initによる初期化→コンテナの可視化→startで開始
の順で行う

308 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 13:32:50 ]
ああ逆か
mainをinitに名前を変えてアプレットとして動作させようとしているのか
無茶な

309 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 16:05:00 ]
おまえらそんな餌に食いつくなよ



310 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 18:24:38 ]
アプリもアプレットも分からん人間には食いつきようもない餌だもんな。

311 名前:デフォルトの名無しさん [2008/05/20(火) 19:29:22 ]
#
# An unexpected error has been detected by Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x77fcd989, pid=1392, tid=2524
#
# Java VM: Java HotSpot(TM) Client VM (1.6.0-b105 mixed mode)
# Problematic frame:
# C [ntdll.dll+0x4d989]
#
# If you would like to submit a bug report, please visit:
# java.sun.com/webapps/bugreport/crash.jsp
#

何これ

312 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 19:31:30 ]
JVMのクラッシュ

313 名前:デフォルトの名無しさん [2008/05/20(火) 19:38:45 ]
設計根本的に変えたほうがいいのかしら

314 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 20:01:41 ]
マンガlovemakeの画像ってどうしたらコピーできますか?

315 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 20:49:29 ]
Javaのデスクトップアプリでデータをローカルで持ちたいとき、
Windowsアプリで言うリソースみたいなかたちで埋め込むにはどうしたらいいの?


316 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 20:59:03 ]
>>315
リソースファイルで埋め込めばいいよ

317 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 22:26:46 ]
>>293
>質問お願いします。
いや、質問してるのは君だから。
「回答お願いします」か「質問させて下さい」だろ。

318 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 22:58:43 ]
main(String[] args){
try{
HashMap<String , String> hashMap = new HashMap<String , String>();
putData(hashMap);
System.out.println("HashMap(bb) : " + hashMap.get("bb"));
System.out.println("HashMap : " + hashMap);
}
catch(Exception e){
e.printStackTrace();
}
static void putData(Map<String , String>map){
map.put("da" , "Five");
map.put("db" , "Four");
map.put("bb" , "Three");
map.put("bc" , "Two");
map.put("aa" , "One");
}
}
これの実行結果が
HashMap(bb) :Three
HashMap :{db=Four, da=Five, aa=One, bb=Three,bc=Two}
こんな感じになるんですが、これと同じように出力されるプログラムをHashSetで書くことはできますか?
もちろん、HashMapなので出力した際の順序まで一緒には出来ないのはいいんdねすが

319 名前:デフォルトの名無しさん mailto:sage [2008/05/20(火) 23:12:25 ]
>318
DataEntry(String, String) というコンストラクタを持つクラスでも作って頑張ってください。



320 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 02:07:02 ]
HashSet クラスには get だの put だのいうメソッドはないから無理。

321 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 07:09:50 ]
HP-UXで稼動するWebシステムの保守を担当することになり
Java未経験ながらいきなり画面の追加をやらされることになりました。
(Webサーバ:SunOneでアプリサーバ:WebOTX、DB:Oracleです)

Javaは過去に勉強したこともありJavaDocなど使えば、何とかソースは読めるのですが、
ソースを格納するディレクトリの構成がイマイチよくわかりません。
なぜこのファイルはここのディレクトリに入れるのか?
とか、
このディレクトリに入れなければならないってのはどこで定義づけられているの?
というようなことです。

ソースの読み方のような入門書じゃなくて、
Webサーバのディレクトリ構成などJavaでのサーバ構築についての
書籍やアドバイスがあれば教えていただきたく。
「UNIXでJava使ってサーバ立てるならこれは基本書だろ!」
というようなものがあれば、ぜひ読んでみたいのですが。

322 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 07:34:32 ]
そんなんプロジェクト毎のルールだろ?
仕様書嫁よ。

323 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 09:51:11 ]
WEB-INFとかマニフェストファイルのことじゃないの?
いままでの開発をどうやってたのか知らないけど、
最近のIDEとかだと配備までやってくれるよ

324 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 09:56:55 ]
アプリケーションサーバのマニュアルを読め、で済む話。


325 名前:デフォルトの名無しさん [2008/05/21(水) 14:15:58 ]
特定の文字列が、作成可能な『ファイル』を示しているかどうかを判定するにはどうすればいいでしょう?
……いえ、以下のようなコードを書いてみたんですが、「a:\backup\」がtrueになるんですよ。

public boolean check(String fileName){
File tempFile = new File(fileName);
try{
tempFile.createNewFile();
if(tempFile.exists() == false || tempFile.isFile() == false){
return false;
}
tempFile.delete();
return true;
}catch (IOException e){
return false;
}
}

EclipseのデバッガでcreateNewFileまでで止めてみると、tempFileの中身は「a:\backup」として表示されています。
どうやら最後のパス区切りは無視されてるようなふいんき(……素でtypoした(汗))です。
これは「文字列の最後の一文字がパス区切りではないこと」で判定するしかないのかな?

326 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 15:22:28 ]
>特定の文字列が、作成可能な『ファイル』を示しているかどうか
イミフ。ファイル名の事?
OS依存。
それとも任意のファイル名でファイルが作成できるかって事?
OS依存。


327 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 16:49:11 ]
>>325
javadoc で createNewFile を確認しましたか?(特に戻り値を)
File は単純ではないクラスですし、扱い方自体を確認した方が良いと思います。

328 名前:  mailto:sage [2008/05/21(水) 18:43:41 ]
パソコン買おうかと思ってるんだけど、QuadのCPU買ってマルチスレッドのプログラミングをJavaで組んだら
WindowsXPでもマルチコアに対応したプログラムになってくれるんですか?

329 名前:デフォルトの名無しさん mailto:sage [2008/05/21(水) 18:50:29 ]
javaのマルチCPU(コア)対応って具体的にはどこら辺まで対応してるんだろうね。



330 名前:325 mailto:sage [2008/05/21(水) 20:25:07 ]
>>326
失礼しました。つまり「a:\backup\」と指定されたら「backup\なんて名前のファイルは作れない。\はファイル名には使えないし、ディレクトリ名じゃなくファイル名を指定しろ」というチェックをしたかったのですよ。
>>325のコードにすれば、ファイル名に使える文字だけが含まれているかと「実際に書き込めるか」が一緒にチェックできると思ったのですが。
最後の「\」を無視して「a:\backup」と「a:\backup\」を等価に扱ってしまうのは、Javaの(WindowsのOS依存の部分の)仕様なのでしょうか?

>>327
はい、trueなら作成成功、falseが帰ってきたら既に存在する、ということですよね?
既に存在する場合の処理はもう少し詰める必要があると思いますが(canWriteを使えばいいかな?)、まずはファイル名の問題をお聞きしようと思い、あのようなコードにした次第です。
ステップ実行をさせると(>>325で書いたとおり)createNewFileの後にa:\backupが作られてしまっているのです。
これは(デバッガの表示どおり) new Fileした時点で最後の「\」を無視して「a:\backup」としてFileのインスタンスが作られてしまっている、ということではないのでしょうか?
ちなみに、他の不正な文字(backup*など)を指定すると、意図したとおりにIOExceptionで落ちるようです。

331 名前:325 mailto:sage [2008/05/21(水) 20:31:51 ]
……失礼。
書き込んだ直後に気が付いたのですが、Fileの仕組みだと、「a:\backup」と「a:\backup\」を等価に扱ってもかまわないのですね。
Fileが扱うのはあくまでパスであり、(まだ存在しない場合)そのパスがディレクトリを示すのかファイルを示すのかは、mkDirするかcreateFileするかによって(後で)分かれる。
よって両者は区別する必要は無いので、「a:\backup」と「a:\backup\」は等価に扱ってよい、という理解でかまわないでしょうか?






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<277KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef