トップページ⇒tech
571コメント167KB

CとJAVAを比較した場合Cの良いとこと悪いとこ

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
ってある?
0412410NGNG
とか、かいてるうちに話は先にいっちゃったのね。
0413デフォルトの名無しさんNGNG
>>410
さらに、「言語レベルで用意されている」という受け答えがすでに意味不明。
この人本当にJavaが何かさっぱりわかっていないよ。
0414デフォルトの名無しさんNGNG
>>411
そうぢゃなくて、「こういう条件が揃った場合には、このクラスを
呼び出す」っていうことが必要な時によく使うけどね漏れは。
0415デフォルトの名無しさんNGNG
>classNameはどこから持ってくるの?
プログラムを止めたくない場合の例では、
サーバー用のクライアントを立ててローカルから送ってあげるって
とこですかね。

>JavaBeansじゃなくて、java.beansパッケージのクラス群のことだったのね
いえ違いますよ。
JavaBeansを使った開発環境作成のためです。

>でもこのリンクが言ってることがリフレクションのすべてだ、なんて
>まさか思ってないですよね?
古すぎるせいか、開発動機が書かれてるホームページはありません。
私はAPIリファレンスから知識を得ていますので、それ以外のことはわかりません。

>共通メソッドを呼び出す
こっちがレイトバインディング云々ですよ。
0416 NGNG
>>411
もちろん静的ですよ。

つうか、最初に明示した条件に反してるでしょう。アフォですか?
論破されたからって「こいつ」呼ばわりですか?
0417410NGNG
いまの流れでいうと、動的っていうのは、ようするにevalのことだよね?
文字列を実行する、しかも呼ばれた側呼び出し元の環境を参照できる、ってことでいいんですよね?

>>413
おれもそうおもう。
0418 NGNG
>>415
なんでサーバーの話をしているのやら。
0419デフォルトの名無しさんNGNG
なんかバイトコード臭い話ばかりだな。
0420デフォルトの名無しさんNGNG
>>415
>古すぎるせいか、開発動機が書かれてるホームページはありません。
>私はAPIリファレンスから知識を得ていますので、それ以外のことはわかりません。
じゃあぜひシステム開発を経験して、リフレクションの便利さ・必要さを
身をもって体感してください。
私もリフレクションが好きでたまらないというわけでは全然ないんだけど、
使わざるを得ない場面に遭遇するから使っているだけです。
JavaでOOPやってるとかならず出てくるですよ、コイツは。
0421デフォルトの名無しさんNGNG
>さらに、「言語レベルで用意されている」という受け答えがすでに意味不明。
ポリモーフィズムの説明はうんざりなんですが、
同じ事をC++でやる事を考えてみてください。
といってもC++知らないでしょうけど・・・。
ちなみにJavaではI/Oの機能はライブラリレベルで用意されていると
表現します。
PERLではI/Oの機能は言語レベルでサポートされています、
と表現します。
0422デフォルトの名無しさんNGNG
>>421
>ポリモーフィズムの説明はうんざりなんですが、
>同じ事をC++でやる事を考えてみてください。
>といってもC++知らないでしょうけど・・・。
漏れはいちおうC++のプログラマーなんだが・・。
うんざりせずにC++での実例をもとに語ってみてください。
0423デフォルトの名無しさんNGNG
>>419
どこがやねん。
0424デフォルトの名無しさんNGNG
>使わざるを得ない場面に遭遇するから使っているだけです
どういう場合で使うのでしょうか?
是非教えてください。
私は一度も使ったことありませんので。

>なんでサーバーの話をしているのやら。
>>動いてるサーバーのビジネスロジックの追加・交換なんか
というわけです。
0425デフォルトの名無しさんNGNG
JAVAか昔やらされたな。
あの言語でファイルフォーマット解析しろって言われた時は
吐きけがしたよ。
0426デフォルトの名無しさんNGNG
>>425
構造体にがぽっとはめられないかね、がぽっと
0427デフォルトの名無しさんNGNG
>>424
上で出したけど、いくつかのデザインパターンではリフレクションを
前提としている場合があります。そして、それを適用した方が
後々のメンテ性が良いことが多いんです。

例えば、実行時のあるオブジェクトの状態によって呼び出すメソッドを
変えたい場合にはリフレクションしかありません。
まあゴリゴリと長いコードを書くのであれば別ですが、OOPだけに
そんなことはしませんよね?
0428デフォルトの名無しさんNGNG
言語レベルっていう言い方が、すでに意味不明(つーか、いろんな意味に取れすぎ)
ライブラリレベルもそう。
言語仕様で定義されているとか、標準ライブラリに含まれているとか、そういう言い方してほしい。
0429デフォルトの名無しさんNGNG
>>422
C++でポリモーフィズムするには
親クラスのメソッドにvirtualをつけて
子クラスでオーバーライドするだけですが・・・
あとは親クラスの型を指すポインタ変数に子クラスを入れて
普通にメソッド呼び出しするだけで
動的バインドが行われます。
JAVAではvirtualをつけなくても全部virtualになってます。
わかっていただけたでしょうか?
あなたのリフレクションを使う動的バインドは
別物でしたか?
0430デフォルトの名無しさんNGNG
つまりJAVAではオブジェクトの代入は全て参照になってしまうと。
0431デフォルトの名無しさんNGNG
>429
つーかC++とJavaの違いをまったく知らないねこの人。
0432422じゃないけどNGNG
あるクラスのインスタンスと、そのクラスから導出されたクラスのインスタンスをバインドできるのは、動的バインドって言わないだろう。
ポリモルフィズムとは言うけど。
リフレクションを使うのは、言語が動的バインドをサポートしていないから、別の手段でそれと同じ事をする、っていう気がするんだが…
0433デフォルトの名無しさんNGNG
>>427
C++で同じ事するときはどうするの?
でさ、デザパタの本ってリフレクションAPIが作られる前からあったけど
どうやってたんだろ??

ところでファイルフォーマットの解析って、
俺はバイナリーエディター使うんだけどさ、
コンパイラでどうやってやるの?
0434デフォルトの名無しさんNGNG
>>427
それはウソ。

リフレクションを使わざるを得ないのは、実行時まで「クラス」「メソッド」を解決できない時だけ。

単に条件分岐で起動するメソッド変えるだけとかなら、デザパタに解決方法がいくつかある。

Class.forName()でクラスロードしてJITコンパイルして実行、つうのは
オーバーヘッドでかすぎなので、なるべくしないほうがいいよ。実行時にいちいち遅くなる
よりは、初期化時だけ遅いほうがナンボかましでしょ?
0435デフォルトの名無しさんNGNG
>あるクラスのインスタンスと、そのクラスから導出されたクラスのインスタンスをバインドできるのは
ゴメン、もうちょっとわかりやすく書いて
意味が良くわからないっす。
0436デフォルトの名無しさんNGNG
>>434
別にウソではないだろう。引数を持つコンストラクタを持つクラスのインスタンスを
動的に生成したい場合はどーする。リフレクションでやるしかないだろ。

>Class.forName()でクラスロードしてJITコンパイルして実行、つうのは
>オーバーヘッドでかすぎなので、なるべくしないほうがいいよ。実行時にいちいち遅くなる
>よりは、初期化時だけ遅いほうがナンボかましでしょ?
ま、よーするにコードの見易さを取るか、速さを取るかだわな。
0437デフォルトの名無しさんNGNG
>>436
引数つきのコンストラクタの起動方法って、結構みんな知らないのね。
Constracterクラスのドキュメント見て味噌。
0438デフォルトの名無しさんNGNG
>ところでファイルフォーマットの解析って、
>俺はバイナリーエディター使うんだけどさ、

話がかみ合わないわけだこりゃ。
0439デフォルトの名無しさんNGNG
というか、ヒープ上のメモリにオブジェクトを生成すること
つまりはnewを使うことを動的にオブジェクトを生成すると
一般的には言うんだが、
どういう意味で使っているのか教えてくれないかな?
0440デフォルトの名無しさんNGNG
>>434
それもやっぱりウソ。ある特定のインスタンスのフィールドをダイナミックに
初期化したい場合にはリフレクションを使う。
それから、単体テストをする場合になんかも使う。setAccessible(true)でフィールドの
中身を取り出す。
0441デフォルトの名無しさんNGNG
>>436
すまん。何言ってるのかワカラン。
動的に生成するって、何をさしていってるの?
JVMが目的のクラスを解決できていれば、単にそのコンストラクタで
newするだけだよね?
0442デフォルトの名無しさんNGNG
>>437
それもリフレクションの一種じゃない?
0443デフォルトの名無しさんNGNG
438はフォーマット判別といいたかったんだと思われ。
と書き込んでみるテスト。
0444デフォルトの名無しさんNGNG
>>440
そういう隠蔽を破壊するようなことをなんでする必要があるの?
単体テストならわかるけど。
0445432NGNG
>>435
強い型付けの言語で、あるクラスの変数を宣言して、そのサブクラスのオブジェクトを代入する、っていうのは、
動的バインドとはいわないだろう、っていうことだ。
って、なんか、解かりやすくなった自身無いなぁ…
0446デフォルトの名無しさんNGNG
>>441
うーむ、言い方が悪かった。
条件によって生成するサブクラスが違う場合(ただし同じインターフェースを
実装しているか、同じ抽象クラスを継承していることが前提)に、getConstructor()
とかやるじゃない。
0447デフォルトの名無しさんNGNG
>>444
アサーションだよ。アサーション用のメソッドが無い場合は
そうやってクラス内の値を取り出すしかない。
0448親切な人NGNG

ネットサーフィン中に、凄い人気掲示板、発見!!!

「はにちゃんねる」↓
http://www.isn.ne.jp/~honey/hc/

ネット内では、現在、この掲示板の話題で、持ちきりです。
0449デフォルトの名無しさんNGNG
>>446
あーわかりました。そういう時は、なるべくFactoryMethodとかで
やったほうがいいよ。(かのヒロミチュ先生もご推薦(藁))
0450デフォルトの名無しさんNGNG
>>445
Javaの場合、その変数(C++だと派生クラスポインタ)に対して
メソッド呼び出しをした時必ず動的バインドが行われる。
過去レスを読んでみると良い。
0451デフォルトの名無しさんNGNG
>>449
そう、だからFactoryMethodとかAbstractFactoryとかその辺のことを言ってるんだよ。
0452デフォルトの名無しさんNGNG
>やったほうがいいよ。(かのヒロミチュ先生もご推薦(藁))
誰?
0453デフォルトの名無しさんNGNG
451の発言を見て
>そういう時は、なるべくFactoryMethodとかでやったほうがいいよ。
という意味がいまだにわかっていないじゃん(w
と書いてみるテスト
0454デフォルトの名無しさんNGNG
>>451
本当に、そのあたりを記述するのにリフレクション使う必要が
あるのかな???C++/Java両刀の人間には不思議なんだけど。
使ってもできるけど、避けたほうがいいんじゃない?という話
ですが、どないでしょ?
0455デフォルトの名無しさんNGNG
そういえば、高木先生スレッドなくなったね。
高木先生はすげーって。
0456デフォルトの名無しさんNGNG
>>454
もうほっといてあげなって。
これだけ説明してもわかってないし、
ヒープとスタックの区別もついて無さそうだよ。
0457デフォルトの名無しさんNGNG
そういうわけで、ポリモーフィズムもわかってない。
きっとOOもわかってない。
あー、哀れ・・・
0458445>450NGNG
>>429のことですか?過去レスって。
0459デフォルトの名無しさんNGNG
という具合になげくお前らももっとわかってなさそう・・
0460スレと全然関係無いけどNGNG
攻撃に弱い人は、たいてい冬厨ですな。
第三者装って揚げ足取るのが得意技。
0461デフォルトの名無しさんNGNG
>>454
Classクラスのfactoryメソッド使うだろ?
まさにそれがリフレクションの機能使ってるやんけ。
0462デフォルトの名無しさんNGNG
なんかずいぶんいろんな意味の「動的バインド」が出てきてる気がする…
0463デフォルトの名無しさんNGNG
>>454
>使ってもできるけど、避けたほうがいいんじゃない?という話
>ですが、どないでしょ?
というのは何故??
0464デフォルトの名無しさんNGNG
FactoryMethod適用時に、switch文を使ってもクラスの動的生成を見かけ上はできる
けど、美しくないよね。
0465この人大丈夫か?NGNG
>>461
なんででしょ?普通にnewで対象クラスのコンストラクタ起動するだけでいいじゃない。
仮にそれでないとFactoryMethodが実現できないなら、C++の時どうするの?
0466デフォルトの名無しさんNGNG
>>443
君らの書くプログラムはファイルreadすると
勝手にフォーマットがわかるですか?
ずいぶん便利ですね。
0467デフォルトの名無しさんNGNG
>>466
「解析」をそんなに責めなくても…
0468デフォルトの名無しさんNGNG
>>465
getConstructorメソッドちゅうのを使うことはリフレクションの機能を使っているということです。
ちなみにこの場合は対象クラスをnew演算子でインスタンス化しません。
0469デフォルトの名無しさんNGNG
>>465
あ、そうそう、Constructorクラスていうのがあるからね。
Java2のAPIガイドみてみ。
0470この人大丈夫か?NGNG
あーそういうことか。
switch分岐よりClass.forName().newInstance();
とかで一行で済ますほうが「ソースが美しい」って話ね。

ここから先は宗教戦争ですので、結論はでませんな。

インスタンス生成メソッドでさえswitchを嫌うことで失う実行時
コストととの相談というあたりを落としどころにしませう。でない
と終わらんよ。
0471デフォルトの名無しさんNGNG
>>465は、lava.lang.refrect をまず読んでからだろうな。
0472デフォルトの名無しさんNGNG
>なんででしょ?普通にnewで対象クラスのコンストラクタ起動するだけでいいじゃない。
newする対象のクラスが動的に変わる場合はハードコーディングしないでしょ?
クラス名をひっぱってきて、Constructorオブジェクトを取得してからインスタンスを
取得する。まあ一度やってみてください。やらんとわからんと思う。
0473デフォルトの名無しさんNGNG
java.lang.refrectだ・・・
0474この人大丈夫か?NGNG
しかし、コレクションあたりと同じ感覚でリフレクション使う人って、
以外と多いんだね。知らんかった。気をつけよう。
0475デフォルトの名無しさんNGNG
>>470
アンタも大丈夫??
0476デフォルトの名無しさんNGNG
>>474
そうそう、そのへんから宗教戦争になるんだよ、たぶん…
0477デフォルトの名無しさんNGNG
>>474
コレクションとリフレクションを同じ感覚で捕らえられる感覚が
おれにはさっぱりわからん。まったく別物じゃん。説明してくれ。
0478デフォルトの名無しさんNGNG
異なるクラスが20個あったら20個の分岐を作るんか?
そりゃアンタ、アフォですよ。
0479この人大丈夫か?NGNG
>>472
あーそうか。サブクラスを実行時まで解決できないパターンでの
ファクトリの話ね。了解です。

はうー、どんなシステムでそんなもんが必要になるのでせうか。
後学の為に教えてチョ。
0480デフォルトの名無しさんNGNG
>>478
3個ぐらいだったら分岐しちゃうような…
0481デフォルトの名無しさんNGNG
実行時に20のうちから1つ選んでインスタンスを作るような場面が、コレクションを使う場面と同じ位あったら、やっぱ考え直すな、おれなら。
0482デフォルトの名無しさんNGNG
>>479
結構いろんなところで遭遇するよ。
例えばA/B/Cというシステムにメッセージを送りたくて、出口が一つしかない場合とか。
メッセージのあて先決定メソッドなんかはabstructにしておくんだよ。
0483デフォルトの名無しさんNGNG
>>480
3個程度しか増えないことがわかっているならそれでも良いんじゃない?
んで、将来も変わらないことがわかっているんならわざわざリフレクション
使うまでもないかもね。
0484デフォルトの名無しさんNGNG
というか、リフレクションって呼ぶとかなり誤解招くな・・・
そんなリフレクションAPIの末端使ってて、リフレクションとか言ってるんだもんな。
解析と判別も笑えたけど。
おめーのバグだろ・・・スレに登録済みですか?(笑)

>Class.forName().newInstance();とかで一行で
一行じゃかけないよ。
横に長くて(笑)
それは冗談にしろ、2つのメソッドは両方引数がくっついてくるわけで
そこら辺もとか考えると、
switchの方が、メンテするとき明らかに楽だと思うけど。

で、リフレクションおじさんは結局のところ
変なデザパタの本をそのまんま丸暗記してたって事なのかな?
さすがにスタックとヒープの違いはわかってると思うけど・・・
そう願いたいよ。
0485デフォルトの名無しさんNGNG
484も、えらそうなこと言ってるけどおそらく実務は皆無だと思われる・・
0486デフォルトの名無しさんNGNG
まぁ、ここでわかってないやつが1000人いても、仕事の現場のわかってないやつ1人にくらべれば、俺の生活への影響は微々たるものだ。
0487デフォルトの名無しさんNGNG
ファクトリーメソッドは便利だから、よく使うよね。
20個分岐するswitchって言うけどさ
20個クラスつくったり、ファクトリーメソッド呼び出す側とか
いろいろ考えてみると別にどうってことないと思うけど。
0488デフォルトの名無しさんNGNG
>>484
>というか、リフレクションって呼ぶとかなり誤解招くな・・・
>そんなリフレクションAPIの末端使ってて、リフレクションとか言ってるんだもんな。
えらそーなことをのたまうオメーが説明してみー。
0489デフォルトの名無しさんNGNG
>switchの方が、メンテするとき明らかに楽だと思うけど。
バカかお前は?
クラスが増えるたびにいちいちソース直してコンパイルかけんのかよ??
そーゆーのはプロパティファイルに外だしするんだよヴォケが。
0490デフォルトの名無しさんNGNG
>>488
というかリフレクションクラス全部挙げたりしたんですが・・・
今日は70メッセージくらい書いたと思うけど。
今日も厨房が一人減って満足だ。
では、おやすみ。
0491デフォルトの名無しさんNGNG
489はmakeツールを知らないらしい・・・
0492デフォルトの名無しさんNGNG
>というかリフレクションクラス全部挙げたりしたんですが・・・
それは説明したことにはならんと思うぞ。
0493デフォルトの名無しさんNGNG
20個分岐のswitchが1箇所ですむなら、べつにいいと思うんだが、このテの話は、
20個の分岐が、あっちこっちに散らばるようなら、ポリモルフィズムつかえっていう時に出てくるなぁ。
でも、20個のcaseのswitchが1つあって、そこで作るオブジェクトを切りかえるような使い方なら、
おれはまよわずそれを使うな。
リフレクション(?)なんぞ使わずに。
0494デフォルトの名無しさんNGNG
491はIDEを使ったことがないらしい・・
ついでにJavaで仕事をしたこともないらしい・・
0495デフォルトの名無しさんNGNG
窓の中の蛙ハケーン
0496493NGNG
あ、もちろん、実行時まで知り得ないクラスのインスタンス作るような場合は、リフレクションでしょうね。
0497デフォルトの名無しさんNGNG
>>493
というかですね、あるシステムの汎用フレームワーク的な部分を構築する
場合は、スーパークラスやインターフェースのかたまりを作って
それをベースにいろんなシステムを開発していくわけです。

そのフレームワークからユーザーパッケージのクラスを、ソースに
ベタ書きで呼び出すわけにはいかんだろ、というワケです。
0498デフォルトの名無しさんNGNG
ファクトリーメソッドにプロパティー使うバカもいるのか。
名スレだな。
0499デフォルトの名無しさんNGNG
普通はどうやるの?? > 498
0500デフォルトの名無しさんNGNG
MS の JVIEW上でも File.setLastModified() だっけ?
出来るメソッド書くとき java.lang.reflect にお世話に
なりました。
0501デフォルトの名無しさんNGNG
>>497
ストリングクラスのオブジェクト渡すのと、
派生クラスのオブジェクト渡すのと何が違うの?
それってファクトリーメソッドの話とは違うよね?
0502デフォルトの名無しさんNGNG
>>500
C#はうざいので消えてください。
0503デフォルトの名無しさんNGNG
>>501
なんか話がズレてるぞ。
汎用なんだから、ある特定のユーザーパッケージもしくはクラスを
importしたりベタ書きしたら、ぜんぜん汎用じゃなくなるじゃんか。
0504デフォルトの名無しさんNGNG
Cの良いとこと悪いとこスレだったはずなのに (ほのぼの〜)
0505503NGNG
汎用パッケージ内のクラス内に、ユーザーパッケージのクラスを
ハードコードすると、汎用パッケージとして意味をなさなくなってしまう
という意味です。
0506503NGNG
それを解決するのに有用なのが上の方にあったリフレクションだ。
0507デフォルトの名無しさんNGNG
>>503
だから、外部から派生クラスを受け取ればいいでしょ?
0508デフォルトの名無しさんNGNG
リフレクション使うにしろ、文字列を受け取るわけでしょ?
ファクトリーメソッドの話はもう終わったのかな。
0509デフォルトの名無しさんNGNG
>>507
スマソ。意味がわからん。
「外部から派生クラスを受け取る」ってどういう意味?
0510ジーンズもケイタイも503が好きNGNG
>>503
汎用パッケージとユーザーパッケージが同時に存在してるなら、どういうことになるんだろうね。
0511510NGNG
どういう→そういう
■ このスレッドは過去ログ倉庫に格納されています