【初心者】Java質問・相談スレッド112【大歓迎】
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001デフォルトの名無しさん
2008/02/08(金) 19:48:24JavaScript, Ajaxの質問は、ここでは受け付けていません。
Web製作板をご利用ください。http://pc10.2ch.net/hp/
過去ログ、関連スレッド、よくある質問とその回答など、
質問をする前に、貴方が見なければならないサイトについての情報は、
下のwikiのページにまとめてあります。
http://www.wikiroom.com/java/
これからJavaでプログラミングを始めたいが、何をすればいいかわからない人も、
wikiからのリンクをおたどりください。
よくある質問
・「コマンドまたはファイル名が違います」
「'javac' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。」
「Exception in thread "main" java.lang.NoClassDefFoundError: 」
http://www.wikiroom.com/java/?path,classpath
・String に == は使うな。equals() を使え。
・「\12288 は不正な文字です。」
文字リテラル以外で全角スペースは使えません。半角スペースに。
・その他の質問→「APIのjavadoc見ろ」
前スレッド
【初心者】Java質問・相談スレッド111【大歓迎】
http://pc11.2ch.net/test/read.cgi/tech/1200151522/
/* 既出の質問や、他に適切なスレが存在する質問は、容赦なく無視されます。
質問をする前にwikiで過去ログ、関連スレ、FAQをチェックしてください。 */
また、当スレで質問をするかたは、回答をもらえたときに、
wikiの更新をして頂ければ、忝のう存じます。
次スレは>>980あたりで。
0809デフォルトの名無しさん
2008/02/25(月) 22:27:18それはおいといて,>>806でいいんだったら
String[] a = { "B" };
と全く変わらないよ
0810798, 803, 806
2008/02/25(月) 22:28:13ちなみに配列への変換は
String[] array = a.toArray(new String[a.size()]);
でいいと思う
0811デフォルトの名無しさん
2008/02/25(月) 22:51:19配列モドキとコレクション
List<String> list = Arrays.asList("A", "B");
System.out.println(list);
list = ArrayList<String>(list); // 編集可能化
list.remove(0);
System.out.println(list);
0812デフォルトの名無しさん
2008/02/25(月) 22:57:41おまいは勘違いしてる。Javaの配列はサイズを変更(Cで言うところのrealloc)出来ない。
配列限定で長さを変えるには、新しい別の配列を作ってコピーするしかない。
今まで挙がってた例は全て新しい別の配列を作っているだけ。
長さが変わる場合、通常はArrayList等のList系のコレクションを使い、
どうしても配列が必要な場面でだけtoArray()で変換する。
0813デフォルトの名無しさん
2008/02/25(月) 23:07:52配列は既にオブジェクト(変数には参照が収められる)だから、auto Boxing はいらないし、
List にも add できる。
int[] を要求している所に Integer[] を放り込むとエラーになるのは型が違うから。
放り込めることを期待するのは
int に対応するのが Integer、int[] に対応するのが Integer[] という感覚があるからだろうが、
この4つの中で、int だけがプリミティブ、Integer だけが値変更が不便なので、
Integer は int をオブジェクトにするためだけにある特別な存在で、
対称性はあまり無い、と考えた方がいい。
0814デフォルトの名無しさん
2008/02/25(月) 23:30:24変更不可なgetterで結構toArray使わんか?
0815デフォルトの名無しさん
2008/02/25(月) 23:32:42main()の中で記述していた処理を、
ほかのファイルの関数に移動したいのですが、どのようにすればよいかわからず、教えてほしいです。
(サブルーチンで処理をするような考え方で。)
c言語で言えば、
main(){
一連の処理のまとまり1
一連の処理のまとまり2
}
となっていたものを
main(){
func1(渡す必要のある変数)
一連の処理のまとまり2
}
func1(引数){
一連の処理のまとまり1の代替
必要があればreturn文
}
といった感じ(型とか細かいことは別として。)に分割したいのですが。
今の自分の知識では、クラスを作って、メソッドを作って、
メソッドをインスタンス化して、
仮にインスタンスが設定された変数の名前がaaaとしたら、
aaa.メソッド(引数) とするくらいしか、頭が回りません。
メソッドを利用したいだけで、インスタンス化が必要なのか疑問で、やりかたがあるような気がしまして。
よろしくお願いします。
0816デフォルトの名無しさん
2008/02/25(月) 23:39:52別クラスにする必要がないのなら、別クラスにしなくていいんじゃない?
mainのほかにクラスメソッド書けばよい。
他からも使いたいけど、インスタンスを作る意味がないのなら、ユーティリティクラスという手もある。
java.lang.Mathみたいなクラス。メソッドは全て、クラスメソッドとして定義する。
0817デフォルトの名無しさん
2008/02/25(月) 23:45:00>メソッドを利用したいだけで、インスタンス化が必要なのか
オブジェクト指向の世界では必要だという前提なんだよ
原則としてすべてのメソッドはどっかのクラスに属していて、インスタンスを介して使用する事が基本
逆に言えばクラスに属するけど、インスタンスを介さないmainメソッドの方が特殊
慣れるまで、メリットを感じるまでは解らんと思うが、最初はそういう世界と思うしかない
0818デフォルトの名無しさん
2008/02/25(月) 23:47:04メソッドはいくら分割してもメソッドだ。
その例だとオブジェクトになるのは (渡す必要のある変数) ってやつだけだな。
main() で
渡す必要のある変数の型 obj = new 渡す必要のある変数の型();
して、
obj.func1()
0819デフォルトの名無しさん
2008/02/25(月) 23:47:46Strint[] a = {"A","B"};
ここで処理して"A"が不要だと分かって、
Strint[] a = {"B"};
↑aが2重定義になるので>>806の方法にしました。
0820デフォルトの名無しさん
2008/02/25(月) 23:49:18// メインクラス(Main.java)
public class Main {
public static void main(String[] args){
Sample.func();
}
}
// サブルーチンクラス(Sample.java)
public class Sample {
public static void func(){
// ↑staticでメソッドを宣言すれば<クラス名>.<メソッド名>でアクセスできる。
System.out.println("Hello, world!");
}
}
0821815
2008/02/25(月) 23:49:35レスありがとうございます、816,817。
>クラスメソッド(816)
クラスメソッドの概念を知りませんでした。ありがとうございます。
>オブジェクト指向の世界では必要だという前提なんだよ(817)
その考えを理解できるように努力していきます。
指摘ありがとうございます。
0822815
2008/02/25(月) 23:51:52レスポンス記述している最中に更新されたようで、失礼しました。
816のおっしゃる、クラスメソッドの具体例ですね。
わかりやすい説明ありがとうございます。
0823デフォルトの名無しさん
2008/02/25(月) 23:51:53>ほかのファイルの関数に移動したい
>サブルーチンで処理をするような考え方で
>メソッドを利用したいだけで
インスタンス化したくないなら当然インスタンス化は不要だ。
0824デフォルトの名無しさん
2008/02/25(月) 23:58:44他の方が指摘してらっしゃるように、
メソッドは、必ずしもオブジェクトに関連付ける必要はありません。
蛇足。Javaでは「他のファイルに記述する」という概念はありません。
あくまでも、クラスを分けるかどうか、です。
それゆえか、クラス内クラスである内部クラスが4種類あります。
0825ちんこ ◆GbXlaaQNk.
2008/02/26(火) 00:30:070826815
2008/02/26(火) 00:32:49821内の『>818』は『>820』の間違いですね。失礼しました。
>818
今コーディングして確認しました。
クラスメソッドを直接呼び出すか、
通常に、通常のメソッドをインスタンス化して呼び出すかですね。
>823
>インスタンス化したくないなら当然インスタンス化は不要だ。
いま確認とりたいと思いコーディングしてみたのですが、
ほかの方が示された用にstaticにするほかに方法あるのでしょうか。
staticなメソッドにするか、インスタンス化するか以外で試せませんでした。
staticにすることをおっしゃっているのでしょうか。(私の821,822のように時間差?)
>824
内部クラス。理解できるよう精進します。Tipありがとうございます。
自分の質問に対して、
816の考え方、817の考え方、の二種類の意見を持つ方に分かれるように感じました。
オブジェクト化するべきとの考えと、ユーティリティメソッドでいいのではという考えと、です。
このどちらを選ぶかは、個人やGrの考え方次第ということなのでしょうか?
それとも、オブジェクト指向的には後者の方が、望ましいが、面倒な手続きは好まれないので、前者が使われるということなのでしょうか。
0827デフォルトの名無しさん
2008/02/26(火) 00:42:12おおざっぱには、
・データが主体ならオブジェクトにする。
・ロジックが主体ならクラスメソッドにする。
くらいで良いのではないかと思ってる。(無論例外は山ほどある)
0828デフォルトの名無しさん
2008/02/26(火) 00:50:08eclipse使いはじめたのですが、eclipseに指摘されるエラーの意味がわからないので教えてください。
たとえば、まさに820のコードを、
eclipseでひとつのファイルに記述すると、
クラスSampleを別のファイルに書けといわれます。
Javaのルールなのでしょうか。
どういった原因なのか教えてください。
eclipse特有で指摘されるものなのでしょうか?
0829デフォルトの名無しさん
2008/02/26(火) 00:51:19何を作っているのかによる。
なんらかの概念(伝票・取引みたいな業務概念や、ファイル・ウィンドウのようなシステム概念)の、
特定のひとつに対する操作であれば、インスタンスメソッドとすることが望ましい。
逆に、概念に属する全ての対象に対する操作や、そもそもその対象を作り出す操作などはクラスメソッドになる。
ただし、実際にはクラスという概念とは関連づかない操作もあり、
Javaの場合は全てのメソッドがクラスに定義されなければならないため、便宜的にクラスメソッドとする。
0830デフォルトの名無しさん
2008/02/26(火) 00:52:53Javaのルール。
publicのクラスはファイル名=クラス名としなければならない。
なので、自動的にひとつのファイルにはpublicクラスは一つまでしか定義できない。
0831デフォルトの名無しさん
2008/02/26(火) 00:58:39830 の通り、Javaの仕様です。
public を外すか、クラス内クラスにするか、
一応、一つのファイルに複数のクラスを記述する方法はあります。
0832デフォルトの名無しさん
2008/02/26(火) 01:03:07830氏、831氏、すばやい回答ありがとうございます。
勉強になりました。
publicがキーワードでしたか。
0833デフォルトの名無しさん
2008/02/26(火) 01:21:48アクセス修飾子には、public, protected, privateがあり、
アクセス制御の範囲としては、上記3つのほかに、修飾なしを含めた4つがあるようです。
で、最後の修飾なしなのですが、
実際に仕事でのプログラミングや、アプリケーションの作成で、使用されるのでしょうか。
範囲が修飾ありの3つと異なるのですが、何も記述しないというのが、どうにも好きになれないみたいな。
基本的に、何らかの修飾をしましょうということは無いですか?
0834デフォルトの名無しさん
2008/02/26(火) 01:31:30たしかに気持ち悪いが、そう決まってる以上、そういうもんだと思うしかない。
使う場面はときどきあるよ。
トップレベルクラスは、publicにしたくなければ、他に選択肢もないし・・・
0835デフォルトの名無しさん
2008/02/26(火) 01:40:22クラスは良くパッケージデフォルトにするなぁ。
パッケージをコンポーネントと見立てて、publicがインタフェースでパッケージデフォルトが実装の詳細。
メソッドやフィールドではあまり使ったことないや。
0836デフォルトの名無しさん
2008/02/26(火) 01:55:23GUIなアプリケーションがさくさく書けてJavaマンセーな状態なのですが、
そろそろ他の言語ってかC++で同等の事ができるようになりたいと思い始めてます。
そんなぼくにお勧めのC++用のIDEを教えてくれませんか?
eclipseみたいにCtrl+spaceなどでガンガン補完できるようなやつで、
リファクタリングが強力なやつがよいです。
(若干スレ違い?)
0837デフォルトの名無しさん
2008/02/26(火) 02:09:29全くスレ違い
CDT
0838デフォルトの名無しさん
2008/02/26(火) 02:46:20派生先からだけ見えて欲しい時は多数あるけど
パッケージ内からだけ見えて欲しい時がないので
デフォルトスコープを使う機会がない。
継承・実装の階層とパッケージ階層とは全く別個のものなのに
1系統の修飾子で片付けようとしたのに無理がある。
パッケージ階層は無視するか2系統用意して組み合わせ可能にしたら良かったのに。
C#(.NET?) だと名前空間は無視するかわりに、
アセンブリ境界に対して internal で制限するかどうかを選べる。
0839デフォルトの名無しさん
2008/02/26(火) 03:20:53そこそこ可視性があるが、言語的に最後の砦であるパッケージの境界でカプセル化してセーフ
というのがパッケージプライベートなので、とりあえず書いてみる的に使うのは、ちょうどよいのかと。
そして、とりあえず書いてみるレベルだったら、
何も修飾子を書かなくてもええじゃないか、のような乗りかと。
なお継承はカプセル化を壊すので、protected を使うのはその一線を越えます。
0840833
2008/02/26(火) 03:45:25返信にただいた内容を元に、学習します。
>839
>なお継承はカプセル化を壊すので、protected を使うのはその一線を越えます。
この点について、初心者向けの説明をいただけませんか。
時間かけると理解が進む資料の場所もみつかるのでしょうが。
0841デフォルトの名無しさん
2008/02/26(火) 07:01:30a = new String[]{"B"};
0842デフォルトの名無しさん
2008/02/26(火) 08:12:42JDK7になったらスーパーパッケージが出来るんだけどねぇ。
JDK7は本当に完成するんだろうか。
0843デフォルトの名無しさん
2008/02/26(火) 10:47:38ありがとうございます。それにしました。
0844デフォルトの名無しさん
2008/02/26(火) 17:19:58テキストでこの章に入るまではこれを使わなくても出力できていたわけ
ですから。
0845デフォルトの名無しさん
2008/02/26(火) 17:22:420846デフォルトの名無しさん
2008/02/26(火) 17:25:510847デフォルトの名無しさん
2008/02/26(火) 18:24:48ベルトコンベアみたいなものを思い浮かべろ
そこに物(データ)を置くと、それはどこかに流れていく
それが出力ストリームのイメージ (streamは流れという意味)
どこに流れていくかは、それがどんなストリームかによる
例えば FileOutputStream だったら、ファイルに書き込まれる
System.out だったら、標準出力に行く
ソケットだったらネットワーク上に送信されていく
出力先が何であるにせよ、そこにデータを書き込むというのは同じ
そういった、何かしらのデータの書き込み口というものを抽象化したのが、出力ストリーム
>>844
別にOutputStreamWriterを使わなければならないことはない
出力を行う方法は他にもいくつかあるが、
そのテキストでは単にそのうちのひとつを紹介してるだけだろう
0848デフォルトの名無しさん
2008/02/26(火) 18:42:430849デフォルトの名無しさん
2008/02/26(火) 18:51:52それ買ってやったほうがいいかな?
てか、なんかJAVAの勉強しても何か実感わかないな〜
やっぱ実際にもの作らんとそういうのは分からないものなのか?
0850デフォルトの名無しさん
2008/02/26(火) 18:59:39どんなテキストか知らないけど
ウィンドウ開いたりボタン押したり絵を出したりといったGUIをやると
実感をわかせるのに効果的だと思う
0851デフォルトの名無しさん
2008/02/26(火) 19:07:460852デフォルトの名無しさん
2008/02/26(火) 19:13:33何か自分で作ってみたいものはないの?
目標を決めるといいかもよ
0853デフォルトの名無しさん
2008/02/26(火) 20:41:10javaでどんなの作れる?とりあえず簡単なものを作ってみたい。
0854デフォルトの名無しさん
2008/02/26(火) 20:42:270855デフォルトの名無しさん
2008/02/26(火) 20:44:020856ibj
2008/02/26(火) 20:55:19alice1 == alice2:true
alice1 == alice3:false
Chapter5.Employee[name = null, salary = 75000.0, hireDay = Tue Dec 15 00:00:00 JST 1987]
Exception in thread "main" java.lang.NullPointerException
at Chapter5.Employee.equals(Employee.java:48)
at Chapter5.EqualsTest.main(EqualsTest.java:17)
と ぬるぽが出てしまいます。
2時間ほど考えたのですが原因がわかりません・・・。super(name)の部分で
どうにかなっていると思うのですがロジック的に正しいと思うのですが・・・。
教えていただけたら幸いです。
0857ibj
2008/02/26(火) 20:56:07public class EqualsTest {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Employee alice1 = new Employee("Alice Adams", 75000, 1987, 12, 15);
Employee alice2 = alice1;
Employee alice3 = new Employee("Alice Adams", 75000, 1987, 12, 15);
Employee bob = new Employee("Bob Brandson", 50000, 1989, 10, 1);
System.out.println("alice1 == alice2:" + (alice1 == alice2));
System.out.println("alice1 == alice3:" + (alice1 == alice3));
System.out.println("alice1.equals(alice3):" + alice1.equals(alice3));
System.out.println("alice1.equals(bob):" + alice1.equals(bob));
Manager carl = new Manager("Carl Cracker", 80000, 1987, 12, 25);
Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 25);
boss.setBonus(5000);
System.out.println("boss.toString():" + boss.toString());
System.out.println("carl.equals(boss):" + carl.equals(boss));
}
}
0858ibj
2008/02/26(火) 20:56:36abstract class Person{
private String name;
public Person(String name){
this.name = name;
}
public abstract String getDescription();
public String getName(){
return this.name;
}
}
0859デフォルトの名無しさん
2008/02/26(火) 20:56:49情報系の大学いった方がまし
0860ibj
2008/02/26(火) 21:00:130861デフォルトの名無しさん
2008/02/26(火) 21:44:23Employee にも何故か name があって、equals で、
other.name.equals(name)で比較してるんじゃないかと。
0862デフォルトの名無しさん
2008/02/27(水) 00:58:27ttp://www.nextindex.net/java/thread/sleep.html
に記述のあるソースの中で、
main()がthrows InterruptExceptionとしてある理由がわからないのですが、
どういう意味なのでしょうか。
教えてください。
今回実行してみた感じ、定義をしなくとも実行には問題がありませんでした。
どの部分が、InterruptExceptionを投げるといっているのでしょうか?
少なくともtry-catchの外しか考えられないのですが、どこかわかりませんでした。
0863デフォルトの名無しさん
2008/02/27(水) 01:06:39javadocに書いてあるから読むと良いよ。
0864デフォルトの名無しさん
2008/02/27(水) 01:16:59String s="あ";
2を取得する方法を教えてください。
0865デフォルトの名無しさん
2008/02/27(水) 01:18:110866デフォルトの名無しさん
2008/02/27(水) 01:28:190867デフォルトの名無しさん
2008/02/27(水) 01:36:09レスありがとうございます、853。
自分もThread.sleep(...);
がInterruptedExceptionを投げる可能性があることはなんとなく覚えたのですが、
今回の場合は、try{}catch(InterruptedEception e){}、の記述によって、
メソッドがthrowsを設定する必要は内容に感じたのです。
うーん…。
0868デフォルトの名無しさん
2008/02/27(水) 01:37:350869デフォルトの名無しさん
2008/02/27(水) 02:06:260870デフォルトの名無しさん
2008/02/27(水) 02:17:57GJ!
0871デフォルトの名無しさん
2008/02/27(水) 02:40:21>>なお継承はカプセル化を壊すので、protected を使うのはその一線を越えます。
>この点について、初心者向けの説明をいただけませんか。
なんてことはない、メソッドをオーバライドすると、親クラスがそのメソッドを呼び出している場合
その挙動にも影響を与えるため、どのような影響があるか(どのように呼び出されているか)を
知る必要があるという意味で、実装が漏れてるという見方ができる。
継承よりも委譲の方が強固だが、継承のほうがお手軽なので
最初は継承を使って、事が複雑になってきたら、委譲にリファクタリングするのがアジャイル的
0872デフォルトの名無しさん
2008/02/27(水) 02:44:060873デフォルトの名無しさん
2008/02/27(水) 02:59:17InterruptedException を飲み込んでいいのは、
実行中のタスクのキャンセレーションポリシーと
実行しているスレッドのインタラクションポリシーが明記してあり
(あるいはそのスレッドのライフサイクルの制御権があり)、
ちょうど両者とも、InterruptedException を飲み込んでOKな場合だけ。
インタラプトを遅延させて処理を継続したい場合は
Thread.currentThread().interupt()を
処理が継続できない・放棄する場合は
InterruptedException を再投げするのが定石
0874デフォルトの名無しさん
2008/02/27(水) 03:00:53そうだね必要ないな
たぶんどこかからコピペしてきた消し忘れかなんかだろう
ちなみに、InterruptedExceptionを揉み消すのは良くない習慣だ
0875873
2008/02/27(水) 03:13:132つのポリシーが上手い具合にOKなときにやっていいのは、インタラプトの発行だった。
タスクが InterruptedExceptionを飲み込んでいいのは、
そのタスクが IntteruptedException を飲み込んでOKなポリシーを持つスレッドからしか
呼び出されないことが保証されている場合だけだな、たぶん
main() は、どこからともなくやって来たスレッドで実行されるから、
基本的に飲み込んではいけないはず
0876873
2008/02/27(水) 03:50:52「インタラプトすると不正な挙動をします」というポリシーを明記したタスクとして
InterruptExceptionを飲み込むならば、単に、
「インタラプトしてはいけないタスク」
+「インタラプトするとエラーメッセージを吐いて終了するっぽいメインスレッド」
=「このスレッド/タスクにインタラプトしてはいけない」
となるだけだった。さあ、どんどん飲み込みましょうねぇ
0877デフォルトの名無しさん
2008/02/27(水) 05:38:33s.getBytes("Windows-31J").length
など。
ttp://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/lang/String.html#getBytes(java.lang.String)
0878デフォルトの名無しさん
2008/02/27(水) 08:04:00たとえばbeautifulというプロパティとしたら規則に従いますと
単純にisBeautiful(),setBeautiful(boolean)となります。
しかし、別の例で「上書き確認を表示する」など動詞的なbooleanプロパティ、confirmOverwriteを考える場合
isConfirmOverwrite(),setConfirmOverwrite(boolean)と、とても気持ちが悪いです。
このような場合は変数名を考え直す必要があるのでしょうか?
それともこういうもの、ということで割り切ったほうがいいのでしょうか?
0879デフォルトの名無しさん
2008/02/27(水) 09:13:57マルチするのが流行りなのか
0880デフォルトの名無しさん
2008/02/27(水) 09:19:46isConfirmOverwritable()
setConfirmOverwritable(boolean)
0881デフォルトの名無しさん
2008/02/27(水) 09:23:420882デフォルトの名無しさん
2008/02/27(水) 09:52:15ありがとうございます!!
0883デフォルトの名無しさん
2008/02/27(水) 11:17:58どうしたらいいですか?
iReoprtで
rectangle、backcolorを変更するというのはわかるんですが、
毎回違うとどうしたらいいのでしょうか?
0884デフォルトの名無しさん
2008/02/27(水) 12:00:12毎ページなのか、毎項なのか、毎行なのか、毎カラムなのか。
まずは日本語でおk
0885デフォルトの名無しさん
2008/02/27(水) 12:20:01だから日本語がおかしいし、説明されても理解できない。
0886デフォルトの名無しさん
2008/02/27(水) 12:41:34>> >>>
0887883
2008/02/27(水) 13:01:04コンパイルしちゃった後でも変更できるんですか?
0888デフォルトの名無しさん
2008/02/27(水) 13:26:210889デフォルトの名無しさん
2008/02/27(水) 14:26:24このへんが参考になるかも
http://www.ibm.com/developerworks/jp/java/library/j-jtp05236/
0890デフォルトの名無しさん
2008/02/27(水) 19:00:220891デフォルトの名無しさん
2008/02/27(水) 19:06:52http://pc11.2ch.net/test/read.cgi/tech/1201346803/l50
0892デフォルトの名無しさん
2008/02/27(水) 21:56:31http://www.ibm.com/developerworks/jp/java/library/j-jtp11234/
このページにある、リスト3: SimulatedCAS クラスの compareAndSwap について質問です。
SimulatedCAS のコードのすぐ下にある説明書きに、
「CASベースの並行アルゴリズムは、スレッドがロックを待つ必要が全くないので、lock-freeと呼ばれます」
という記述があります。
しかし SimulatedCAS の compareAndSwap メソッドは synchronized メソッドに
なっています。Simulated って書いてあるから実際使うときは違うやつ使うのか
なと思いきや、 リスト4 のコードで思いっきり使ってあります。
compare-and-swap アルゴリズムを真似たプログラムは、 synchronized であっても
ロックされないように最適化されるということでしょうか?
0893デフォルトの名無しさん
2008/02/27(水) 22:05:06毎日一回株価を取得してDBに放り込むプログラムを作ろうと思ってるんだけど
JAVAで時間がきたらサーバー上で実行するってことかのう?
どんな仕組みでできる?
それだけわかればDBにも移せるしダウンロードもできそうなだんだが
0894デフォルトの名無しさん
2008/02/27(水) 22:17:240895デフォルトの名無しさん
2008/02/27(水) 23:33:28バージョンに応じて違うクラスファイルを読み込むようにするには
どうしたらよいでしょうか?
JARアーカイブとMANIFESTファイルを利用しており、クラスライブラリが
たくさんあるのでバージョンごとに違うJARを作成するのは避けたいのですが・・・
0896デフォルトの名無しさん
2008/02/27(水) 23:43:070897867
2008/02/28(木) 00:01:48申し訳ないんですが、ぜんぜんわからないです。
1時間くらいgoogleしてみたのですが、
そこから派生するキーワードや、
似たような単語が、同様の意味を成しているのかもわかりませんでした。
せっかく手を差し伸べていただいたところ申し訳ありません。
飲み込む、もみ消す、握りつぶす、
非チェック例外、チェック例外、チェック済み例外、チェックされる例外…
飲み込むというのは、InterruptedExceptionを投げずに処理してしまうということなのでしょうか…
0898デフォルトの名無しさん
2008/02/28(木) 00:11:59調べるの面倒です。教えてください。
このスレッドを読んでいて、初めて 委譲 を知ったのですが、
クラスの外部から、インスタンスのフィールドにアクセスできる仕様というのは、
オブジェクト指向的に、思い切り間違えなのでしょうか。
委譲 の概念が普通に使われるためには、
フィールドへのアクセスは、
クラスに所属するメソッド経由で、アクセスされる仕様である場合でないと、
アクセス方法に統一性がもたせられませんよね。
そもそも、このような質問をする原因が、
なぜフィールドの値をpublicにするなど、
所属クラス内のメソッド以外からの、フィールド変数(?)へのアクセスが許可される必要があるのか
が、わからないためです。
質問の仕方が、気に入らなければ、無視してください。
たぶん調べてもまともな回答にたどり着くに、長い時間がかかりそうだと思い、怠けています。
0899デフォルトの名無しさん
2008/02/28(木) 00:19:180900デフォルトの名無しさん
2008/02/28(木) 00:21:29interface AnythingExecutor{
public void doAnything();
}
public class AnythingExecutor14 implements AnythingExecutor{
public void doAnything(){
// JRE 1.4 用の処理
}
}
public class AnythingExecutorFactory{
public static AnythingExecutor create(){
// JRE のバージョンを取得する
if( 1.4 だった){
return new AnythingExecutor14 ();
}
else if( 1.5 だった){
return new AnythingExecutor15 ();
}
...
}
}
// 実際の処理
AnythingExecutor executor = AnythingExecutorFactory.create();
executor.doAnything();
0901デフォルトの名無しさん
2008/02/28(木) 00:23:16それは Java に対する質問ではない。
適当なスレを探すよろし。
0902デフォルトの名無しさん
2008/02/28(木) 00:29:32問題ないんじゃないか。setter/getter があるってことは、すなわち
public フィールドとほとんど等値なんだし。
ただ、フィールドへのアクセスと同時に何かしたい、外部からは
read のみに変えたい、みたいなことってことが結構ある。
そこで、フィールドは private にして隠す。アクセスは public な
getter/setter からのみ。というよくある構成に統一することで、
機能追加に対応しやすくなるからこうしましょう、という寸法。
中には「フィールドへのアクセスもオブジェクトに対する"操作"で
あるから、メソッドであるべき」なんていう人もいると思う。
まぁその辺をどう割り切るかは個人個人によるのでは。
あと委譲の話と何が関係あるのかが分からなかった。
0903デフォルトの名無しさん
2008/02/28(木) 01:11:04> 問題ないんじゃないか。setter/getter があるってことは、すなわち
> public フィールドとほとんど等値なんだし。
1つ大きな違いがあるぞ。setter/getterの場合、本来は違うものを同じものに見せ掛けるのが簡単にできる。
後付けで振舞いを変えるとか、透過的に処理を割り込ませたりするとか、実体をリモートに持たせるとか。
0904デフォルトの名無しさん
2008/02/28(木) 01:33:31publicフィールドにガンガンアクセスするコードを書いてるのですが、ひょっとして一般的じゃないんですか?
>>903さんがどういう処理を指してるのかいまいちつかめません。。
0905デフォルトの名無しさん
2008/02/28(木) 01:38:00うわー、ありがとうございます!
早速試してみます。
0906デフォルトの名無しさん
2008/02/28(木) 01:38:32やさしいなー
0907デフォルトの名無しさん
2008/02/28(木) 01:54:20意味が分からなければ今のスタイルを続けていけばいい。
そのうち面倒ごとが起こったときにアクセッサの意義が分かるよ。
0908デフォルトの名無しさん
2008/02/28(木) 07:09:55値を一つ変えるのに、払うコストをどれだけ小さく出来るか、という話。
この例はシミュレートだけど、ハードウェアでサポートしている CPU もあるよ、と言うこと。
「スレッドがロックを待つ必要が全くない」というのは、
リスト2で行われてるような処理をする必要がない、ということ。
リスト4で注目するべき点は、increment メソッド内の get と CAS の間で、
継続したロックが保持されていないこと。
そして、increment 自体が呼ばれてから値を戻すまでに
value の get 値が 1 "以上"変わること。
レス数が900を超えています。1000を超えると表示できなくなるよ。