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


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

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



1 名前:デフォルトの名無しさん [2008/03/01(土) 18:16:51 ]
プログラミング言語Javaに関する質問スレです。
JavaScript, Ajaxの質問は、ここでは受け付けていません。
Web製作板をご利用ください。pc10.2ch.net/hp/

過去ログ、関連スレッド、よくある質問とその回答など、
質問をする前に、貴方が見なければならないサイトについての情報は、
下のwikiのページにまとめてあります。
www.wikiroom.com/java/
これからJavaでプログラミングを始めたいが、何をすればいいかわからない人も、
wikiからのリンクをおたどりください。

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

前スレッド
【初心者】Java質問・相談スレッド112【大歓迎】
pc11.2ch.net/test/read.cgi/tech/1202467704/

/* 既出の質問や、他に適切なスレが存在する質問は、容赦なく無視されます。
質問をする前にwikiで過去ログ、関連スレ、FAQをチェックしてください。 */
また、当スレで質問をするかたは、回答をもらえたときに、
wikiの更新をして頂ければ、忝のう存じます。

次スレは>>980あたりで。

207 名前:201 mailto:sage [2008/03/06(木) 13:57:50 ]
>>205

だとすれば、
無駄にinput.nextLine()を走らせて回避するしか方法はないのでしょうか・・

208 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 14:57:03 ]
>>205
まあ、nextLine が、"23" の直後から改行までを、改行抜きで食ってるだけ。
よって、"23<改行>" なら、戻り値の列長はゼロ。

>>207
そうそう。無駄に nextLine を走らせてください。そういう仕様です。
細かく調整したいなら sikip というものもあります。

209 名前:201 mailto:sage [2008/03/06(木) 22:17:42 ]
>>208

そうですか、分かりました
skipの方も試してみます

ありがとうございました


210 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 22:21:33 ]
今、自分のPCに
Java SE 6 Update 3 がインストールされており、
ブラウザでアプレットなどが起動できるのですが、

Update 4 や Update 5 をインストールすると
Update 3 で起動できていたアプレットが起動しなくなり、
ブラウザを閉じようとすると、固まってしまう状態になります。

ランタイムをアンインストールして Update 3 に戻すと正常に動作するようになるのですが、
Update 4 以上のバージョンで何か問題があるのでしょうか?

コントロールパネルのJavaの設定で、
インターネット一時ファイルなどを削除してみても、
アプレットは動作しませんでした

211 名前:デフォルトの名無しさん mailto:sage [2008/03/06(木) 22:40:16 ]
リグレッションバグ踏んだとか

212 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 00:14:08 ]
アプレットが元々バグってて、古いバージョンではたまたま動作してただけとか

213 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 08:29:09 ]
お世話になります。

SwingでGUIのプログラム作ってみているのですが、
イベント動作(?)を設定できずに悩んでいます。
お力添えください。

(awtの?)ActionListener,ActionEvent,ActionPerformed()で、
イベント動作を記述したいです。

JPanel A
├JPane B
|├JButton 1 (implements ActionListener)
|└JButton 2 (implements ActionListener)
└JTabbedPane
 ├JTextArea 1
 └JTextArea 2
例えば、JFrame以下に、上記の構造のコンテナの階層があって、
各コンテナは、直上のコンテナでインスタンス化される。
以上としたときに、
ボタンのActionPerformed()にて、
テキストエリアの内容を保存したり、とにかくテキストエリアにアクセスしたいのですが、
その手段がわかりません。
( 続く)

214 名前:213 mailto:sage [2008/03/07(金) 08:29:32 ]
(続き)

すべての変数をJPanel A 直上でインスタンス化して、
上記の構造をつくり、
JButtonは、内部クラスにすれば、動作の設定はできるのですが、
コンテナの数が多くなってきたときに、内容を読むのが辛い気がします。

また広域な変数を作ることでも可能なのでしょうが、あまり使いたくないです。

どのようにすればよいでしょうか。

最終的には、JMenuBar以下のメニューからのアクセスをしたい、
且つ、JMenuBar以下の構造は、クラスとして、
外部クラスか内部クラスとして宣言したいです。
また、JTabbedPaneは、メニューなどから、増加させたり、削除させたりしたいのですが、
「各コンテナは、直上のコンテナでインスタンス化される。」
のルールにのっとった記述ができなく、簡単化のため、上記の例を出しました。

よろしく御願いします。

215 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 10:36:36 ]
>>213
ボタンとテキストエリアで行うことを仕様とし、その実装をクラスにする。
そのインスタンスをパネルAで生成し、パネルBとタブの生成時に渡す。



216 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 12:10:01 ]
数値a, b(long、doubleも含む)のどちらが大きいか比較し、
a<bなら負、a>bなら正、a==bなら0を返すような標準APIってありますか?

自分で作れというのが最もなのですが、割と頻繁に使う状況に遭遇するので、
標準でそのようなAPIは無いのか疑問になって質問しました。
Mathにはなかったようなのですが。

217 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 12:18:40 ]
>>216
new BigDecimal(a).compareTo(new BigDecimal(b)) とか?
無限大やらNaNやらの場合は知らん。

218 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 12:27:43 ]
>216
数値といっても型が違えば単純には比較でないだろ、常考
比較する為の一般に通用する仕様がないわけだから安直に標準APIじゃ提供しようがない

219 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 12:33:59 ]
それくらい自分で作れ。

220 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 13:07:15 ]
>>217
ありがとうございます。
取りあえずこれでいけそうですね。

>>218
説明不足でした。型はプリミティブ型でよいです。
System.out.print()のように引数タイプに全てのプリミティブ型を
用意しているクラスメソッドがあったので、数値比較についてもあるのかなと思ってました。

221 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 13:21:14 ]
同じ型どうしなら a-b でいいのだけど、それじゃダメってことだよね。


222 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 13:39:09 ]
>>216
×最も
○尤も

(a==b)? 0: (a<b)? -1: 1;

223 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 13:39:31 ]
>220
だからdouble と int をどうやって比較するのかと(ry

224 名前:デフォルトの名無しさん [2008/03/07(金) 13:40:42 ]
パネルにコンポーネントをadd()してからそのコンポーネントをadd()の反対にすることはできますか?

225 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 13:45:31 ]
ん?remove(Component)のこと?



226 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 13:59:21 ]
>>223
値範囲で 217 に負けるけど、Double.compare(double, double) でも良いと思うのですが
変換で何か重要な問題があったっけ……

227 名前:216 mailto:sage [2008/03/07(金) 14:03:57 ]
本当に説明不足でした。
ぐだぐだですみません。
返す型は int。
型はプリミティブ型。
>>221
(int)(long型 - long型)すると、差がInteger.MAX_VALUEより大きい場合に
問題が起きそうなのでその方法はとりませんでした。

>>222さんのように三項演算子で書く方法が一番スマートそうですね。
どうもでした。

228 名前:216 mailto:sage [2008/03/07(金) 14:08:05 ]
>>226
読む前に投稿していました。
まさにこんな感じのを求めてました。
ありがとうございます。

229 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 14:10:20 ]
>>226
int i = 0;
double d = 0.0;

230 名前:226 mailto:sage [2008/03/07(金) 14:13:42 ]
>>229
日本語での解説をお願いします。

231 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 14:14:32 ]
(゜д゜) はぁ?

232 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 14:22:24 ]
javadocよく嫁

233 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 14:23:29 ]
言い忘れた
byte型の昇格じゃなきゃ特に演算時に気を付けることはない。

234 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 14:27:46 ]
嘘八百を並べた悪徳スレ

235 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 14:43:59 ]
>>216
>>226でもいいけど、long が 64ビットなのに対して double の仮数部は 53ビットしかない。
だから例えば
System.out.println(Double.compare(0x20000000000000L, 0x20000000000001L)); //=> 0
System.out.println(0x20000000000000L == (double)0x20000000000001L); //=> true

逆に言うと、あらかじめ精度が必要ない事が判っていれば
Double#compare(double, double) で構わない。



236 名前:226 mailto:sage [2008/03/07(金) 14:55:25 ]
>>235
なるほど。これはお勧め出来なかったですね、申し訳ない。

Long.MAX_VALUE と (double) Long.MAX_VALUE
==> 9223372036854775807
==> 9.223372036854776E18

// int と double についての方も、こういうことなのでしょうか?

237 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 14:58:14 ]
>>236
int と float だと、float の方が精度低いので問題起きる可能性がある。

238 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 16:36:10 ]
(・д・)

239 名前:デフォルトの名無しさん [2008/03/07(金) 16:54:44 ]
MVCモデルについて質問です。
現在、MVCを使ってマインスイーパを作ろうというプロジェクトを行っています。
Mでは、m*nのテーブルを裏返したり、フラグを変更させる動作を持たせる事にします。
ここで問題なのですが、
この配列をVに描写してもらう時に、渡すのは数字の入った2次元配列です。
これを例えば1なら1と表示させるというようにすればいいように思えますが、
Vを作る人は、Mがどういう仕様かを知ってはいけないと思います。
つまり、Mで、1という数字を100という風に書こうが31という謎の値で書こうが関係ない設計にしなければならないと思います。
この場合、私の考える中で唯一これを満たす方法は、
Mに描画のメソッドを実装して、Vで委譲させる方法ですが、
MVCの原則として、Mは描画や出入力を行ってはいけない事になっています。
そもそも、View側でもm*nで待っていてくれている保証はないわけですが、
MとVの独立性を保つためにはどのように設計すればよいのでしょか?

240 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 17:07:46 ]
>>239
>Vを作る人は、Mがどういう仕様かを知ってはいけないと思います。 

いやいやいや。
ビューはモデルの仕様を知っている。
でなければ、何を描くのかすらわからんではないか。
ツリーモデルをマインスイーパービューに渡してどうしろというんだ。
ツリービューはツリーモデルを描く。
マインスイーパービューはマインスイーパーモデルを描く。
interface MinesweeperModel {
 int getWidth();
 int getHeight();
 boolean isFlagSet(int x, int y);
 boolean isOpen(int x, int y);
 boolean hasMine(int x, int y);
 void addChangeListener(ChangeListener l);
 void removeChangeListener(ChangeListener l);
}
こんなのでいいかと。
これをどう実装するか(二次元配列?)は、モデルの実装の詳細であって、ビューはそれを知る必要はない。
これをどう表示するか(JTable?)は、ビューの実装の詳細であって、モデルはそれを知る必要はない。
ただし両者とも、そのインタフェイス (MinesweeperModel) の仕様は知っている。

241 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 17:13:31 ]
MVCってjava関係ないじゃん。
ゲーム作ってるならこっちの方が適切。

ttp://pc11.2ch.net/test/read.cgi/gamedev/1155209226/l50
ゲームにおけるデータ構造・クラス設計・パターン

242 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 17:15:00 ]
クリックされたら配列に入力され、その後配列と対応する場所に四角を書きたいんですが
うまくいきませんorz
どこがだめなんでしょうか?
import java.applet.*;
import java.awt.*;
import java.awt.event.*;

/*
<applet code="proto" width=200 height=200></applet>
*/
public class proto extends Applet implements MouseListener{
Point p;
boolean bl[][] = new boolean[20][20];
public void mouseClicked(MouseEvent me) {
p = me.getPoint();
bl[p.x/10][p.y/10] = true;
repaint();
}
public void mouseEntered(MouseEvent e) { }
public void mouseExited(MouseEvent e) { }
public void mousePressed(MouseEvent e) { }
public void mouseReleased(MouseEvent e) { }
public void paint(Graphics g){
for(int x=0;x<20;x++){
for(int y=0;y<20;y++){
if(bl[x][y] == true){
g.fillRect(x*10,y*10,10,10);
}}}}}

243 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 17:18:48 ]
>>242
addMouseListener

244 名前:239 [2008/03/07(金) 17:22:15 ]
>>240
プログラムが出来たら、うpするので
その時に評価してもらおうと思います。
いろいろ考えると難しくて。実装じゃなくて、設計が。
設計やさんは優秀じゃなきゃ出来ませんね。
設計が腐ってるとすべてが終わる。
設計がしっかりしてれば
実装なんか中卒だろうが高卒だろうが
理系だろうが文系だろうが
関係なしに出来るのではないかと思えてきましたが、
実際のプログラミング現場ではやはり設計というのは一番優秀な人がするものなのでしょうか?


245 名前:242 mailto:sage [2008/03/07(金) 17:26:33 ]
うわ・・恥
>>423どうもありがとうございました



246 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 17:32:36 ]
実装をなめんなよ

247 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 17:38:34 ]
>実際のプログラミング現場ではやはり設計というのは一番優秀な人がするものなのでしょうか?

そういう話題はマ板向き

248 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 17:51:19 ]
設計する人が優秀とは限らないが、優秀でない人が設計すると火事になる

249 名前:239 [2008/03/07(金) 18:02:27 ]
今、ぼくは
「クラスが独立であるとは、クラスが単独でテスト可能である事と同値である」
という持論に基づいてプログラムしています。
これが正しいかどうかは置いといて、
テストが不可能、例えば乱数に寄ってしまっている設計はいけない設計ですか?
例えばマインスイーパなら、爆弾を仕掛けると思いますが、
爆弾を仕掛けるのを乱数に頼って、イニシャライザに組み込んでしまうと、
動作ごとにどこに爆弾が仕掛けられたか分からず、
「ここを押せばこういう状態に遷移する」
といったテストが行えません。
今作ってるプログラムはまさにこうなのですが、
これは失敗した設計ですか?

250 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 18:06:26 ]
>>240の書いているようなモデルインターフェースを作っていれば、そんなものいくらでも実装で変更できると思うんだけど。

251 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 18:13:59 ]
>>249
乱数を元にしないNonRandomMinesweeperModelを使ってテストすればいいだけだ

252 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 18:17:45 ]
乱数に限定した話なら乱数シードを外から渡すようにすれば良いだけの話。
再現性が保てない設計は失敗と言っていい。

253 名前:239 [2008/03/07(金) 18:20:36 ]
>>252
再現性が保てない設計は失敗なんですか。
確かにぼくもこれではテストが出来ないではないかと
すごく不安になってました。
乱数シードを外から渡してみます。

もしぼくが設計者だったら大火事でしたね。

254 名前:239 [2008/03/07(金) 18:22:40 ]
コーディングの段階からjavadocに基準した
コメントを書いておくべきですか?
みなさんはどうなされていますか?

255 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 18:22:41 ]
>>249
イニシャライザが何か初期化してても、とりあえずそれを無視して、
テスト用の盤面に書き換えてからテストすればいいんじゃないか



256 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 18:35:59 ]
>>254
場合による。

ライブラリとかみたいにドキュメントはきっちりしてた方がいい場合もあるし
アプリケーションで要求変更がばしばしくる案件なんかではドキュメント書いても
次の日には書き換えなきゃいけなくなったりで割に合わない場合もある。

257 名前:239 [2008/03/07(金) 18:36:36 ]
>>255
それが可能な設計ではないという事です。
でも、これは具体的な話ですが、
initBoard(int i, int j, int[][] bombBoard)
とかいう風にします。
今は
initBoard(int i, int j, int bombNum)
としています。これは爆弾の数から内部で爆弾が配置されたボードを弾いて、それを使って
Boardをinitializeしようという設計だからです。
でもこれは爆弾ボードの生成で乱数を使ってしまうので、再現性がありません。
しかし、上記のメソッド定義だと、ユーザが好き勝手なテーブルを引数にしてしまいます。
これはユーザに使い勝手がいいとは言えない気がします。
例えばもし縦横の配列数が違った場合は、Exceptionを出して処理を終了させればいいのでしょうか?

258 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 18:43:02 ]
>>257
>initBoard(int i, int j, int[][] bombBoard) 
>とかいう風にします。 
>今は 
>initBoard(int i, int j, int bombNum) 
>としています。

それ両方あればいいじゃん
ユーザは使い勝手の良い方を選んで使えばいい

259 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 18:44:47 ]
initBoard(int width, int height, int bombNum, long seed) で良いじゃん。

260 名前:239 [2008/03/07(金) 18:45:50 ]
>>258
なるほど、オーバーロードがありましたか。
その発想は気づきませんでした。
確かにJavaAPIにある多くのライブラリには複数イニシャライザが設定されてるものがありますね。
でも書き直しですね。このままだとDRYに反する。

261 名前:239 [2008/03/07(金) 18:54:11 ]
>>259
seedを引数にするという発想は正常ですか?
自由な配列を入れさせてもし大きさが違っていたら
Exceptionを発行して弾くというのは
少し感覚的におかしい気がします。
「型が違う」「クラスが違う」という弾き方は正常かと思いますが、
配列の大きさが違う、という事で弾かれるのは、
外から見てる人が、引数に対してすでに設定したBoardの大きさを意識して
入れなくてはいけない事になります。
これは使い勝手がいいとは言えないし、
おそらく正しい設計に基づいているであろう
GUIのライブラリがそういうものがあったかどうか考えても
なかったように思えます。
(もしあったら教えてください)

262 名前:239 [2008/03/07(金) 18:55:17 ]
あ、でもそれじゃseedがどういう時にどんな配列が出来るか
は予想がつかないのでテストケースが書けないですね・・・

263 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 18:58:04 ]
>260
DRYだろオーバーロードは基本的に。
void a(int i) と void a(int i, int j)
があったとすれば、前者の実装は
a(i, 0)
のように記述するだろ?

264 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 19:01:00 ]
>>261
乱数のシードを渡すくらいなら Random オブジェクトを渡した方がいいと思う
そうすれば SecureRandom を使うこともできるし (セキュアな盤面が必要な状況なんかないだろうけど)、
テスト目的に Random を継承してランダムでない値を返すようにしたオブジェクトを渡すこともできるし

265 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 19:10:59 ]
>>235
言語仕様的には strictfp が付いてなければ IEEE754 に従っている保証はない
ちなみに、IEEEの倍精度は精度は53桁だけど仮数部は52ビットだった気が



266 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 19:14:07 ]
優秀でない人が実装すると設計が無駄になる

267 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 19:19:17 ]
>>264
Random を継承してランダムでない値を返すくらいなら、
単に、数値を返すメソッドを持ったインタフェースを渡した方がいいと思う


268 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 19:22:29 ]
>>254
コメントはテストケースにしっかり書いた方が良いよ

269 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 19:27:09 ]
>>262
どういうシードを渡した時にどういう配列が出来るかは、どういう乱数が発生するかと等価だから
乱数生成ルーチンのテストにしかならん。除外可能。でなければ乱数生成を自前でやる必要が
出て本末転倒な事になる。異なるシードを与えたときに異なる配列になることが確認できれば十分
(もちろんその整合性も)。

というかホワイトボックステストがしたいのかブラックボックステストがしたいのかはっきりせれ。

270 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 19:29:13 ]
つうか、そこまでするんだったら、
interface InitBoard {
int width();
int height();
boolean bomb(int x, int y)
}
などというインタフェースを渡せばいいやん

271 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 19:41:35 ]
>>265
>>235の例だけでいえば定数式だから strictfp ついてなくても
0 だったり true だったりは言語仕様で保証されてる。

272 名前:239 mailto:sage [2008/03/07(金) 19:41:41 ]
>>270
インターフェイスを使うメリットが分かりません。
インターフェイスは、そこに書いてあるメソッドに実装を強要するだけであり
なぜこの場面で使わないといけないのかが分かりません。

273 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 19:42:49 ]
「エンジニアリング設計の基準を実際に満足することのできる唯一のソフトウェアドキュメントはソースコードだけだ」
と Jack Reeves 様が言っております。
ソフトウェアで巷で言われている「設計」などというものは
他の工学では単に設計の骨組みに過ぎないのです、たぷん

274 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 19:44:13 ]
上にもいろいろ書いてあるだろ?
インターフェイス使えば同じ機能でも別の実装が可能になるんだって。
もう少し自分でいろいろ試行錯誤するべきだと思うよ。

275 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 19:46:44 ]
マインスイーパーのマス程度にポリモーフィズムはいらんだろw
必要になったとすればもうそれは別のゲームになってるから設計からやり直したほうがいい。



276 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 19:57:15 ]
javaじゃなくて設計の話になってるな。

277 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 20:04:12 ]
>>272
インターフェースを使わないメリットが分かりません。
そこに書いてあるメソッドを呼び出せれば Board の実装が可能なのに
なぜこの場面で使うといけないかが分かりません。

278 名前:デフォルトの名無しさん [2008/03/07(金) 20:14:08 ]
JavaのClass.getDeclaredClasses()の使い方について質問させてください。
あるクラスで宣言されているクラス名を獲得しようとしているのですが、思うように動いてくれない状況です。
以下のようなテストコードを作ったのですが、

public class Hello {
public String message=new String("Hello");

public static void main(String[] args){

Hello hello=new Hello();
Class helloClass=hello.getClass();
Class[] classes=helloClass.getDeclaredClasses();

System.out.println("Num of Classes "+classes.length);
for(Class cls:classes){
System.out.println(cls.getName());
}
}
}

自分の想定では

Num of Classes 1
java.lang.String

という表示が出ることを期待していたのですが、実際の出力は

Num of Classes 0

となってしまい、クラス名の配列を獲得できません。
ドキュメントを読んだりネットを検索しても理由が分からず、お知恵を拝借したい次第です。
ちなみに、JDKは1.6.0_04を利用しています。

279 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 20:22:54 ]
>>278
getDeclaredClasses() はメンバーフィールドで使用されているクラスを得るんじゃなくて
メンバーとして宣言されたクラスおよびインターフェイスを得る。

よーするに、
public class Hello {
 public static class Foo{}
 public static void main(String[] args){
  System.out.println(Hello.class.getDeclaredClasses().length); //->1
  System.out.println(Hello.class.getDeclaredClasses()[0]); //->class Hello$Foo
 }
}

280 名前:278 mailto:sage [2008/03/07(金) 20:31:08 ]
>>279
>getDeclaredClasses() はメンバーフィールドで使用されているクラスを得るんじゃなくて
>メンバーとして宣言されたクラスおよびインターフェイスを得る。

さっそくのご回答ありがとうございます。
理解しました。なるほど、そういうことだったのか…

私がやりたかったのは前者だったのですが、
あるクラスのメンバとして宣言されている(has a関係の)クラス名を取得する方法という方法は
あるのでしょうか?


281 名前:デフォルトの名無しさん [2008/03/07(金) 21:22:44 ]
突然ですがすみません。
最近VistaのBasicにJava6update5をインストールしてから、
Yahooオークションの詳細な残り時間が表示されなくなるばかりか
ブラウザが固まってしまいます。
私だけでしょうか。
help.yahoo.co.jp/help/jp/auct/bid/bid-24.html
このヘルプ通り設定してもダメでした。

282 名前:デフォルトの名無しさん [2008/03/07(金) 21:29:20 ]
あなただけです

283 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 21:37:06 ]
内部クラスについて教えてください。
public class Class2 {
  public static void main(String args[]){
    new Class2().sub2();
  }
  int a = 100;
  public void sub2() {
    new Class3().printPrintln();
    new Class4().printPrintln(this);
  }
  class Class3 {
    void printPrintln() {
    int a = 1000;
    System.out.println(a);
    //System.out.println(this.a);
    }
  }
}
class Class4 {
  public void printPrintln(Class2 variableClass2) {
    System.out.println(variableClass2.a);
  }
}
のコメントアウトされている行で、Class2のaを取り扱いたいのですが、
不可能でしょうか?thisのような何かは存在しませんか?

284 名前:デフォルトの名無しさん [2008/03/07(金) 21:39:08 ]
存在します

285 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 21:54:29 ]
>>280
> あるクラスのメンバとして宣言されている(has a関係の)クラス名を取
> 得する方法という方法はあるのでしょうか?

java.lang.ClassのAPIリファレンスを眺めて、それでもわかりませんか?





286 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 21:58:48 ]
>>281
うちでも出た。IE7 + Java6u5。Javaコンソールに
java.lang.ClassFormatError: Incompatible magic value 1011373133 in class file default
って出て、リロードすると固まる。
Operaだとちゃんと表示されるんだよね。IE用Java Plug-inの問題かも。
つうか、ヤフオクのアプレットのclassファイル、古くない?version 45.3 ってjava1.1かよ…

287 名前:278 mailto:sage [2008/03/07(金) 22:00:51 ]
>>285
すいません。分からないです。

当初はgetDeclaredClasses()じゃなくてgetClasses()使ってたんですが、
それでうまく行かなかったのでgetDeclaredClasses()を使って、やはりダメで…という状況です。


288 名前:デフォルトの名無しさん [2008/03/07(金) 22:04:12 ]
>>286
そうですか。
さきほどアンインストールしたら直りました。
失礼しました。

289 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 22:11:39 ]
Javaプログラムのデプロイとアップデートについて質問させてください。
ローカルの*.classファイルが新しいものかどうかをチェックするには
どのような方法があるでしょうか?

ファイルのタイムスタンプでよいかと思ったのですが、ユーザがタイムスタンプを
書き換えるようなアーカイバを利用していた場合に対処できません。

.classファイルに外から見てわかるような内部バージョン番号をつけることはできるのでしょうか?

290 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 22:17:40 ]
JAR にしてマニフェストに書く。

291 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 22:21:39 ]
>>287
getFields?

292 名前:278 mailto:sage [2008/03/07(金) 22:37:12 ]
>>291
そうか、その手があったか!

import java.lang.reflect.Field;

public class Hello {
public String message=new String("Hello");

public static void main(String[] args){

Hello hello=new Hello();
Class helloClass=hello.getClass();
Field[] fields=helloClass.getFields();

System.out.println("Num of Classes "+fields.length);
for(Field fld:fields){
System.out.println(fld.getType().getName());
}
}
}


で、実行

Num of Classes 1
java.lang.String

必要な結果が得られました。ありがとうございました。

293 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 22:53:16 ]
>>290
おお、Jarでまとめるのもひとつの手ですね。タイムスタンプ署名もつけられるようですし。
ただその場合、アップデート時にはJarごと更新する必要がありますよね?
あまり大きなJarだと問題が出そうです。

更新されているclassファイルのみ更新する方法がないものでしょうか・・・

294 名前:デフォルトの名無しさん mailto:sage [2008/03/07(金) 23:36:29 ]
問題が出るような大きなJarって何Gくらいなの?

295 名前:デフォルトの名無しさん [2008/03/08(土) 00:18:32 ]
3メガぐらいで十分大きいんじゃん



296 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 01:40:41 ]
>>295
GBクラスではないです。大きくても100MBいかないぐらいまででしょうか。
でもクライアント数が多いとまるごとアップデートは現実的ではないと思いまして。

297 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 01:44:05 ]
クラスファイル等のリソースを設計、実装、運用などに合わせて分類し、それを元にjarを分ける

298 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 02:52:26 ]
Javaこそ、このあたりの自動更新機構/ツールが備わっていてもよさそうなものだが

299 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 03:05:43 ]
つ Java Web Start

300 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 08:12:22 ]
Propertiesを継承して俺俺Propertiesを作っています
getProperty(key)をオーバライドして取得した値がnullの時
exceptionを投げたいのですがPropertiesにthrowsが無いからダメと怒られます

こんな時どうすればいいですか?


301 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 08:14:14 ]
RuntimeException を投げる

302 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 08:18:37 ]
RuntimeException又はそれを継承したExceptionを投げる

303 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 08:31:43 ]
nullチェックした方で任意の例外投げる

304 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 08:35:56 ]
>>301-303
ありがとうございます。
なるほど、UserExceptionを継承したのを投げてたのですが
RuntimeExceptionを継承したのを投げたらいけました。




305 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 11:00:19 ]
>304
それはあまりよくない設計
PropertiesをラップしたMyPropertiesを作る方がいい
継承はほどほどにな



306 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 11:11:26 ]
>>305
それは考えたのですが
カバーするメソッドが多くなるので
どうかなと思ってやめました

307 名前:デフォルトの名無しさん mailto:sage [2008/03/08(土) 11:13:35 ]
>306
そんなに多いか?
利用側に関してはgetProperty くらいでしょう使うのは。

初期化とかは内部で閉じるから、余計なパラメータ等を設定されるのも防止できるぜ。
不要なものまで公開しない方がいい。






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

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

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