★★Java質問・相談スレッド182★★

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (アウアウウー Sa73-AAco [106.132.135.194])
垢版 |
2018/11/19(月) 11:37:06.10ID:C68x9bSia

プログラミング言語Javaに関する質問スレです。
JavaScript, Ajaxの質問は、ここでは受け付けていません。
Web製作管理    http://pc11.2ch.net/hp/
Webプログラミング http://pc11.2ch.net/php/
をご利用下さい。

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

質問時の心得
・コンパイルエラーか実行時エラーか、エラーではないが意図しない動作なのかはっきりしろ。あとエラーメッセージちゃんと読め。
・前提条件としてOS、開発環境、バージョン、使用フレームワーク等を明記。

前スレ
★★Java質問・相談スレッド181★★
https://mevius.5ch.net/test/read.cgi/tech/1518252580/
VIPQ2_EXTDAT: checked:vvvvvv:1000:512:----: EXT was configured
2018/11/20(火) 03:38:42.96ID:JZJLduoZ0
カキコ
3デフォルトの名無しさん (ワッチョイ ff51-A3/R [123.1.86.88])
垢版 |
2018/11/24(土) 10:37:52.52ID:6yt0KLFG0
Threadが完了しているかはどうやって調べるんですか?
isInterrupted()とisAliveはあスレッド終了時falseでした。
4デフォルトの名無しさん (ワッチョイ 6f9f-zhOP [175.134.57.7])
垢版 |
2018/11/24(土) 16:28:54.46ID:Q9o1GKtC0
>>3
http://pppurple.hatenablog.com/entry/2017/05/12/234030
5デフォルトの名無しさん (ワッチョイ ff51-A3/R [123.1.86.88])
垢版 |
2018/11/24(土) 17:16:53.81ID:6yt0KLFG0
どうやらisAlive()はstart()前はfalse,start()後実行中はtrue,完了したらfalseのようです。
start前と完了後を区別するにはgetStateが良いようですね
6デフォルトの名無しさん (ワッチョイ ff51-A3/R [123.1.86.88])
垢版 |
2018/11/25(日) 08:53:36.37ID:vfhmRXQZ0
スレッド1がメンバー変数Aを更新、そのあとメンバー変数Bを更新
スレッド2から見て、Bの更新が見えるのにAが見えない、ということはありえますか?
2018/11/25(日) 10:55:13.27ID:bdma9Nzw0
マルチスレッドは前後関係が決まらないから、確実なものはない。
待ち合わせでもしていれば、できるかも

デッドロックもあるし、10年以上開発していないなら無理。
資源が共有されるから、素人がプログラミングできるはずがない!
2018/11/25(日) 11:39:22.30ID:0ClRa5n60
スレッドは最初から並列、同期を考えてプログラムするだろう。初心者には無理
2018/11/25(日) 16:50:34.64ID:k7/W79Is0
>>6
その変数Aが volatile でなければ読む側のスレッドで動いているコードによっては起こり得ると思う。
(もっと他順に更新順序と読む順序の問題でそうなる事もあるが)。

かといって volatile にしただけで安心してはいけない。更にロック掛けた上で読み出した方が良い。
Java なら synchronized 使うとかだな。
2018/11/26(月) 23:37:17.15ID:iInmVawEa
volatileはそのAとBの間に制約があるなら使えないし、A、Bが自身の制約になるときもか。あと他の変数の不変条件になってるなら使えないよ。
ていうかvolatile変数の変更が外から見えないならロックいらんだろ。
2018/11/27(火) 00:38:32.20ID:2AqLChXV0
何を言ってるのかわからん。
12デフォルトの名無しさん (ワッチョイ 6f9f-KQkZ [175.134.57.7])
垢版 |
2018/11/27(火) 01:26:54.27ID:IxTjeZ9T0
>>10
制約って?具体的にどういう状態?

privateにして外からgetするメソッドを呼ぶだけのいわゆるプロパティにしてしまえばマシにはなるかもな。
しかしそれだけだとA,Bを個別に読んだら一方しか更新されてない事は起こりうるのでは?
更新する側がロックせずに一つづつ更新している最中に一つづつ読んでしまえば起こりうるよね?
13デフォルトの名無しさん (ワッチョイ ff51-A3/R [123.1.86.88])
垢版 |
2018/11/27(火) 10:43:53.15ID:Kxtwr65F0
1スレッド書き込み、マルチスレッド読み込みの場合、
並行処理による問題が発生する可能性はありますか?
例えばHashMapにアクセスするとして。
2018/11/27(火) 10:50:21.39ID:DSo9/Qg/0
1. スレッドA には、Xが存在しない

2. ここで書き込みスレッドが、X を書き込むと、

3. スレッドB には、Xが存在する
15デフォルトの名無しさん (アウアウウー Sa27-ml8p [106.132.137.248])
垢版 |
2018/11/27(火) 12:39:58.02ID:gTSgzwA4a
>>13
あります。
2018/11/27(火) 15:26:01.15ID:r2rVvRkR0
ありまぁ〜す
17デフォルトの名無しさん (ワッチョイ 6f9f-zhOP [175.134.57.7])
垢版 |
2018/11/28(水) 01:33:35.79ID:BkKDQWNJ0
>>13
HashMap のドキュメントに Collections.synchronizedMap() を使う方法が書いてある。
それ使った方が自分でゴチャゴチャ考えるより楽だ。
2018/11/29(木) 21:49:08.42ID:wn8bMma4a
排他ロックが無駄だからいちいち同期するなよ。
concurrent collectionつかえ。その用途ならConcurrentHashMapがあるだろ。
19デフォルトの名無しさん (ワッチョイ 22a6-3M3s [123.48.217.134])
垢版 |
2018/12/06(木) 14:31:29.56ID:ncTdmVKO0
ラムダの中でローカル変数のオブジェクトを参照している場合、
そのメソッドを抜けた後そのローカル変数を参照する事は安全ですか?

//in some method
Obj local = new Obj();
GuiPart gui = new GuiPart((event)->local.method(event));
return;//この後ラムダがイベント処理で呼ばれた場合、localは参照可能か?
2018/12/06(木) 14:37:21.87ID:U/FtrhZGM
>>19
安全に参照可能だよ
自動生成されたクラスのインスタンスフィールドに保持される
21デフォルトの名無しさん (ワッチョイ 3be3-OBpN [218.33.217.200])
垢版 |
2018/12/06(木) 15:00:26.25ID:fFxLBqGn0
逆に気を付けなければならないのは、
非同期処理などで、外側のオブジェクト(エンクロージングインスタンス)がいつまでも破棄されなくなる可能性があること。
2018/12/07(金) 02:12:41.95ID:5Mie+W080
匿名クラス(無名クラス)の型について質問です。
ArrayListに格納した後、get()で取り出して使いたいのですが
型名が分からずキャストできません。
どなたか回答をお願いします。
23デフォルトの名無しさん (ワッチョイ 4e9f-n9Ol [175.134.57.7])
垢版 |
2018/12/07(金) 02:50:49.80ID:4kVuFzeP0
>>22
List にキャストすればいいのでは?
2018/12/07(金) 04:50:43.67ID:NzONXxAO0
>>22
クラスを定義するときに継承してるはずなので
instanceofで継承元の型かチェックして
型のクラスにキャストすればいいのじゃないかな

継承先のクラスへのキャストはわからん
2018/12/07(金) 17:13:48.47ID:5Mie+W080
>>23
>>24
ありがとうございました。

ちょっと俺の説明も分かりにくかったと思いますので、
コードを下に書きますね。
List<Object> al = new ArrayList<>();
al.add(new Object {
__int anonymousField = 5;
__void anonymousMethod() {
____System.out.println(anonymousField);
__}
});
al.get(0).anonymousMethod();

こう書くと、匿名クラスはObject型にキャストされているので、
anonymousMethod()を呼べずコンパイルエラーになります。
そこで最終行でキャスト演算子を使おうと思ったのですが、
匿名クラスの型が分からずキャスト出来なかったんです…。
2018/12/07(金) 17:27:22.40ID:bk7fHByDM
言語の限界に挑む系のチャレンジかなんかしてるのかそれ。
27デフォルトの名無しさん (ワッチョイ 227c-OBpN [123.230.34.235])
垢版 |
2018/12/07(金) 18:02:53.57ID:L+lXnzjp0
interface Hoge {
__void anonymousMethod();
}
...
List<Object> al = new ArrayList<>();
al.add(new Hoge {
__int anonymousField = 5;
__void anonymousMethod() {
____System.out.println(anonymousField);
__}
});
((Hoge) al.get(0)).anonymousMethod();

普通はList<Hoge>として、下のキャストを要らないようにする分けだが。
2018/12/07(金) 18:14:33.74ID:8/WIy6eid
他で呼ぶことを目的とするなら匿名クラスにしてはだめでは?
2018/12/07(金) 18:24:24.58ID:5Mie+W080
>>26
そんな大層なことではありませんが…。

>>27
>>28
ありがとうございました。

では匿名クラス内のメンバ(特にメソッド)の存在意義って何なのでしょうか?
30デフォルトの名無しさん (アウアウウー Sadb-MnXc [106.132.136.161])
垢版 |
2018/12/07(金) 18:39:34.95ID:qRyaIDL9a
>>29
そのクラス内で処理を分けて起きたい時に作る。
呼び出されるメソッド一つに全て書くとわかりづらくなる時とかね。
2018/12/07(金) 18:44:34.94ID:8/WIy6eid
渡した先で処理させるのにitemを厳密にしなくてすむ

>>25の例で言うなら自分で作ったcollectionクラスにanonymousMethodをなんか処理する機能をつけてやれば
渡すitemはanonymousMethodを持ってれば匿名でも実体があっても良くなる
2018/12/07(金) 23:44:22.73ID:5Mie+W080
>>30
>>31
ありがとうございました。
33デフォルトの名無しさん (ワッチョイ 12a6-3Pua [123.48.217.134])
垢版 |
2018/12/13(木) 23:17:41.00ID:kncoc2aJ0
総称型の派生的な定義を一元化したいです。
class ClassA<T1>{}
とあるとき、T2 extends T1とか、T3 extends ClassB<T1>とかを定義したい。
しかしT1の横に並べるとClassAの子クラスにおいて指定する必要が生じます。
ClassA<T1, T2 extends T1> こうしたくない。
ClassAChild extends ClassA<T1Concrete, T2Concrete>みたいにT2Concreteの指定が生じるから。
しかしクラスに定義しないとメソッド毎に総称型の定義が必要になります。
T1だけを指定するという状況を保ったまま、T1に依存した他の派生的な総称型をクラス内で定義したい。
これは可能ですか?
34デフォルトの名無しさん (ワッチョイ 36b6-DQC4 [111.90.6.3])
垢版 |
2018/12/13(木) 23:40:07.10ID:Dzj4x6Rs0
>>33
こういうこと?
class A<T> {
 class B<U extends T> {
 }
}
35デフォルトの名無しさん (ワッチョイ 12a6-3Pua [123.48.217.134])
垢版 |
2018/12/13(木) 23:44:58.06ID:kncoc2aJ0
class ClassA<T1>{
 public <T2 extends T1> T2 method1();
 public <T2 extends T1> T2 method2();
 public <T2 extends T1> T2 method3();
}

このようにメソッド毎に総称型を定義するのが嫌なので、クラスのところで指定したいのですが、
そうすると子クラスでT1から自動的に決定するものをわざわざ指定しないといけません。
class ClassA<T1, T2 extends T1>{//子クラスでT2を指定する必要が発生
 public T2 method1();
 public T2 method2();
 public T2 method3();
}
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況