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

■ このスレッドは過去ログ倉庫に格納されています
2018/02/10(土) 17:49:40.56ID:l9ZzjyKP
プログラミング言語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質問・相談スレッド180★★
https://mevius.5ch.net/test/read.cgi/tech/1492780397/
586デフォルトの名無しさん
垢版 |
2018/07/25(水) 09:27:06.98ID:GNtg4sP8
>>585
というと?
2018/07/25(水) 19:09:16.20ID:s14gtaOU
否定だけして根拠示さないのは例の人かな?
588デフォルトの名無しさん
垢版 |
2018/07/25(水) 20:01:38.85ID:ekeRKo17
「ははーん、さてはおめー何もわかってねーな」という台詞を言ってみたかっただけの人か?
2018/07/25(水) 20:12:44.09ID:QfwTkRmU
下記ブログの例題がEclipseでもpaiza.ioでもコンパイルエラーになって色々試したのですが解決出来ないので原因と回避策を教えてください
Eclipseでのエラー: 型の不一致: Object から int には変換できません
paizaでのエラー: Object cannot be converted to int


https://nompor.com/2017/11/16/post-1118/
ブログのページ最後にある例題サンプルです
「Iteratorで全要素アクセス」

18行目
int data = it.next();//次の要素を取得します。

---
例題そのままをコピペしてもエラーになるので自力解決が出来なくて困っています
590デフォルトの名無しさん
垢版 |
2018/07/25(水) 20:17:15.54ID:GZRArLRs
>>589
Iterator it = arr.iterator();
これを
Iterator<Integer> it = arr.iterator();
こうや!
2018/07/25(水) 20:20:52.44ID:QfwTkRmU
>>590
それはやったのですが、エラーになりましたね
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
integer を型に解決できません
2018/07/25(水) 20:27:16.64ID:QfwTkRmU
自己解決しました
エラーのpopアップに表示されていたキャストをすれば解決しました

もしかしたらブログを執筆していた頃には問題の無かった書き方が厳密になったとかなのでしょうか?
原因が例題書かれた方のミスなのか仕様変更なのか意味が分からないままエラーだけ出なくなった状況ですが次へ進みます。
ありがとうございました

18行目(変更前
int data = it.next();//次の要素を取得します。

18行目(変更後
int data = (int) it.next();//次の要素を取得します。
2018/07/25(水) 20:30:23.90ID:QfwTkRmU
そもそもなのですがIteratorって使いますか?
他にも配列などの操作方法あるようですし
どうしてこんな面倒な書き方で参照したりするのか疑問です
2018/07/25(水) 20:31:46.04ID:2d5RfbzO
>>589
https://ideone.com/qLRSSK
Object を Iterator にキャストしてオートボクシングを利かせてみた
2018/07/25(水) 20:40:39.19ID:QfwTkRmU
>>594
ありがとうございます
596デフォルトの名無しさん
垢版 |
2018/07/25(水) 20:51:02.31ID:ITmWCwNQ
>>592
それは解決になってない。
キャストで逃げたら、ジェネリック使う意味がなくなる。
597デフォルトの名無しさん
垢版 |
2018/07/25(水) 20:54:37.41ID:GZRArLRs
>>591
integerじゃなくてIntegerだよ
https://paiza.io/projects/EqWeDViwiv4OmZldGaHtNA
598デフォルトの名無しさん
垢版 |
2018/07/25(水) 21:27:25.94ID:GZRArLRs
>>594
int data = (int)it.next();
int data = (Integer)it.next();
これどちらもオートボクシングが行われてますよ
プリミティブ型で格納されてるわけじゃないっすから

オートボクシング使わずに書くならこう!
int data = ((Integer)it.next()).intValue();
2018/07/25(水) 21:49:55.62ID:QfwTkRmU
>>597
13行目
Iterator<Integer> it = arr.iterator();
自分<integer>でミスタイプしてましたねすみません

>>598
勉強になります

>>これどちらもオートボクシングが行われてますよ
>>プリミティブ型で格納されてるわけじゃないっすから
まだ意味がわからないので調べてみます

>>596
>>キャストで逃げたら、ジェネリック使う意味がなくなる。
まだ意味がわからないので調べてみます

ありがとうございます
2018/07/25(水) 22:28:09.59ID:QfwTkRmU
>>589
の原因と教えていただいたことを自分なりに調べた結果のまとめと確認です
(連投すみません

13行目(変更前
Iterator it = arr.iterator();

これがジェネリクス総称型として型を指定していないのでObject型となり次の

18行目(変更前
int data = it.next();//次の要素を取得します。

ここでInt型にObject型を代入しようとして型不一致で代入できないとのエラーが出ていた

解決策としては

13行目(変更後
Iterator<Integer> it = arr.iterator();

明示的に<Integer>を宣言することで次の

18行目(変更前
int data = it.next();//次の要素を取得します。

ここで代入可能となったが
これはInt型とInteger型のオートボクシング機能が働いている
2018/07/25(水) 22:28:36.05ID:QfwTkRmU
>>600
これで合ってますか?
最後の「これはInt型とInteger型のオートボクシング機能が働いている」のかちょっとまだ不安です
キャストはしてないけどオートボクシングが働いてたら意味がない?
このあたりがまだよく理解出来てないと思います
>>598 これをふまえると・・・

>>オートボクシング使わずに書くならこう!
>>int data = ((Integer)it.next()).intValue();

13行目(変更後
Iterator<Integer> it = arr.iterator();

18行目(変更後※
int data = it.next().intValue();//次の要素を取得します。

※ここまでやらないと意味が無いのでしょうか??
一応どちらも正常に結果出てますが内部的に違いがあるのか不安です?
602デフォルトの名無しさん
垢版 |
2018/07/25(水) 22:37:49.97ID:GZRArLRs
>>601
オートボクシングはプリミティブ型とラッパークラスの変換を
自動で行う仕組みのことで

毎回、↓こう書くの面倒だよね
int data = it.next().intValue();

じゃあ↓こう書けるようにしよう
int data = it.next();

ということで導入されたものだから積極的に使ったら良いよ
2018/07/25(水) 22:44:09.05ID:QfwTkRmU
>>602
Iterator<Integer> it = arr.iterator();
int data = it.next();

オートボクシングは便利機能なので使ってOKで
.intValue();が自動的に省略されてるだけで結果は同じ

これで解決ってことですね!納得しました!
ありがとうございました
2018/07/25(水) 22:44:22.96ID:+qk7Pgth
だね
Integerからintへの変換ではインスタンス生成されないし
intからIntegerへの変換でも数字が小さければインスタンスは生成されない
インスタンス生成を抑えるために小さな数字はあらかじめIntegerオブジェクトが作られていて使い回されるようになっているから
値オブジェクトみたいな感じ

コスト気にするよりオートボクシングを積極的に使って可読性の高いコードを書こう
605デフォルトの名無しさん
垢版 |
2018/07/25(水) 22:46:30.24ID:GZRArLRs
>>600
ジェネリクスで型を指定すれば、型が間違ってたときにコンパイルエラーに
なってすぐに気づくことができるのだけれども

ジェネリクスで型を指定しないと、型が間違っててもエラーにならないのよ
実行してデータが処理されないとコードが間違ってるかわからぬのよね
エラーが起きないデータもあったりするとデバッグが超大変

ジェネリクスが使えるときは型を指定して使ったが良いよ
2018/07/25(水) 22:56:34.68ID:QfwTkRmU
>>604-605
>>コスト気にするよりオートボクシングを積極的に使って可読性の高いコードを書こう
>>ジェネリクスが使えるときは型を指定して使ったが良いよ

質問で丁寧に回答していただきさらにアドバイスまでいただき感謝です!
勉強になりますありがとうございます!
607デフォルトの名無しさん
垢版 |
2018/07/26(木) 00:12:38.71ID:5ROtQy7H
>>589
それ原因が分かったぞ。(勘のいい奴なら既にわかっていると思うが)。

そのブログのページのソースのこう表示されてる個所あるだろ。

Iterator it = arr.iterator();

この部分の HTML のソースを見てみたらこうなってた。

Iterator<Integer> it = arr.iterator();

しかしこの通りに表示させたいなら HTML 文書の中ではこう書かねばならない。

Iterator&lt;Integer&gt; it = arr.iterator();

他の同じような記述の個所はこういう変換をやっているのにこの部分だけ忘れており
<Integer> 部分がブラウザによって HTML のタグと解釈されて丸ごと表示されない
状態になっていた、ということ。
2018/07/26(木) 00:23:57.38ID:Hk2Eswys
2018/07/26(木) 01:12:56.68ID:3Q0DG2FF
>>607
よく見つけられましたね凄いです!
どなたかがブログへご指摘されてくださったようで確認しようと再度HP確認したら既に修正されていました!
あまりの速さに2度驚きました

この質問スレにもブログにも勉強するのにとても助かっています
いつもありがとうございます
2018/07/26(木) 09:12:21.23ID:1RynmuAu
>>607
611デフォルトの名無しさん
垢版 |
2018/07/26(木) 13:20:41.96ID:EM3EzxKL
    ./__.))ノヽ    
    .|ミ.l _  ._ i.)    わしが指摘した
   (^'ミ/.´・ .〈・ リ    
    .しi   r、_) |            ______
     |  `ニニ' /             |  | \__\___
  ___.ノ `ー―i´             |  |   |= |iiiiiiiiiii|
/⌒ヽ  \____/\            |  |   | =. | !!!!!!!|
|   ヽ____| \__. __    |  |   |三 |_「r.、
|  //     // ̄.\ //⊃ヾ)   |__|_/(  ) ̄ ))
ヽ ______//r_/| |.||⌒ヽ〜〔 ̄ ̄! ̄ ̄ ̄/ ̄ ̄\((
612デフォルトの名無しさん
垢版 |
2018/07/26(木) 20:19:44.88ID:l6j0Y1pF
定義されてるディレクトリ配下のログが誰かに開かれてたら何もしないって処理作りたいんですけど、ファイルが誰かから開かれてるかを調べる方法ありますか?
613デフォルトの名無しさん
垢版 |
2018/07/26(木) 20:22:42.75ID:l6j0Y1pF
古くなったログの削除の為に使用するためです
2018/07/26(木) 20:39:32.04ID:9i/IJhFr
自分でそのファイルを読み取り排他で開いてみるしかない
失敗したら他のプロセスがオープンしているということ

排他(副作用)なしでファイルのロック状態を知る方法はない
615デフォルトの名無しさん
垢版 |
2018/07/26(木) 21:15:30.96ID:l6j0Y1pF
>>614
ありがとうございます。
明日試してみます!
2018/07/26(木) 21:33:54.42ID:ekiha7MK
うーんどうなんだろう、設計
617デフォルトの名無しさん
垢版 |
2018/07/27(金) 02:20:59.11ID:O4NPrPXG
>>612
Linux の場合は fuser コマンドを使うと指定のファイルをオープンしているプログラムのプロセスIDが分かる。
何も出力がなければ開いているプロセスはない。

他のUNIX系OSにもこのコマンドはあるかも知れない。Windows の WSL にはこのコマンドはあった。

その他のOSではどうやるか知らないが、もし fuser コマンドがあるのならそれを使えば同じようにできるんじゃないかと思う。

Windows の場合は他のプロセスが開いている最中にリネームしようとするとエラーになるそうなのでこれを利用するという手があるようだ。
但し同じ方法はOSが違ったら使えない(例えばLinuxやUNIX系OSでは使えない。WSLはわからない)。
https://code.i-harness.com/ja/q/153800
2018/07/27(金) 06:07:34.18ID:br8yoTOu
paiza.ioってローカルPCのファイルやフォルダ操作するコードは実行出来ないですか?
619デフォルトの名無しさん
垢版 |
2018/07/27(金) 12:15:33.71ID:4+ImbG1U
>>614
ログを開くアプリケーションによってはロック状態を認識できませんでした。
FileChannelクラスのtryLookメソッドを使いました。
OSがcentosでLibreOfficeで開いてるときはロック状態でしたが、geditで開いたときはロックされてなかったです。
何か初心者がおかしやすいミスとかってありますかね。
もう諦めてるんですがgeditが特殊なんですかね
620デフォルトの名無しさん
垢版 |
2018/07/27(金) 12:16:37.86ID:4+ImbG1U
gedit以外のテキストエディタでも同じでしたね
ロックの確認できません。
621デフォルトの名無しさん
垢版 |
2018/07/27(金) 12:58:52.13ID:ki81FzEq
普通はしないよ。
一々ロックしてたら、たとえばGitなんか阿鼻叫喚の地獄になる。
622デフォルトの名無しさん
垢版 |
2018/07/27(金) 13:04:46.00ID:4+ImbG1U
>>621
そうなんですね
623デフォルトの名無しさん
垢版 |
2018/07/27(金) 13:26:56.82ID:EBOSMkzO
>>619
UNIX系OSではオープンしただけでは普通はロックまで掛からなくて、別途 flock() したり fcntl() でロックするようになっている。なので本当に必要な場合しかロックしないのが普通だ。

オープンしてるかどうかだけ確認したいなら fuser コマンドや lsof コマンドを使った方が楽だ。
Linux限定で良いなら /proc ディレクトリ以下を自分で探ってもできるけどね。
それだと多分本当にLinuxのみになるし fuser や lsof も Linux 用なら中で同じことしてるだろうから任せた方が良い。
624デフォルトの名無しさん
垢版 |
2018/07/27(金) 14:29:19.42ID:4+ImbG1U
>>623
色々教えて下さりありがとうございます。
2018/07/29(日) 02:53:34.15ID:noej9t8s
javaのバージョンって1.8だったり8だったり表記が複数あるようですが何なんですかこれは
2018/07/29(日) 04:29:48.18ID:SHCnQYdt
なんなんでしょうね
2018/07/29(日) 05:54:37.87ID:Oaphdh9V
初見殺し
628デフォルトの名無しさん
垢版 |
2018/07/29(日) 08:38:57.85ID:7lOBGcOb
>>625
Javaのバージョン
https://so-zou.jp/software/tech/programming/java/introduction/version/
意外と知らないバージョン表記・数字の豆知識
http://www.atmarkit.co.jp/ait/articles/1003/26/news106.html

理由はよくわからないが、やはり営業的な理由なんじゃないだろうか。
バージョン番号が大きい方が他の製品よりも良いものであるかのような印象を与えられるから。

Perlなんかは(フリーソフトで誰にも売る必要がないためか)これの逆をやってしまい、大きな変更が
あったのにほんのちょっとしかバージョン番号を上げなかったためにほとんど違いがないと誤解
された事があり、それでその後はバージョン番号の振り方のルールを変えた。
2018/07/29(日) 13:22:46.86ID:pFjYaTQt
>>618
ブラウザから、自分のPC 内にアクセスできたら、大変!

何でも盗み放題w
すべての情報が、どこかのサーバーに送られてしまう
630デフォルトの名無しさん
垢版 |
2018/07/29(日) 21:11:31.52ID:JZa4OXPE
eclipseをphoton にしてワークスペースをそのまま引き継ごうとしたら実行できなくなっちゃった。どうすればいいか教えてちょ
631デフォルトの名無しさん
垢版 |
2018/07/29(日) 21:23:30.06ID:JZa4OXPE
eclipseをphoton にしてワークスペースをそのまま引き継ごうとしたら実行できなくなっちゃった。どうすればいいか教えてちょ
2018/07/29(日) 21:46:32.56ID:sUhDPIHz
ごめんちょ
633デフォルトの名無しさん
垢版 |
2018/07/30(月) 05:51:28.50ID:HJqNjAI+
>>631
${HOME}.eclipse
を削除してみたらどうだろ

workspaceをバックアップして
空にして、インポートで取り込むとか
2018/07/31(火) 23:16:57.30ID:ZNFzWxLv
初歩的な質問になるんですが異なる2つのクラスで1つの値を共有したいときってどういったやり方あります?
class a
String str

class b
a.setStr

class c
a.getStr
大分省略してますがこんなことをやりたいです。
実行順はbで更新した後にcで取得
2018/07/31(火) 23:22:07.36ID:3ipQI8/S
クラスbとcのメンバにaクラスのフィールドをもちbとcのコンストラクタでaを設定する
2018/07/31(火) 23:30:21.51ID:ZNFzWxLv
class b
a a
public b
a = new a

a.set

class c
a a
public c
a = new a

a.get

みたいな感じですかね?
この場合ってbとcでそれぞれ作ったaのインスタンスって別物扱いになりません?
2018/07/31(火) 23:31:13.26ID:0/QW8S54
>>636
外でnewして渡せ
2018/08/01(水) 00:58:32.44ID:r0ZYJdIw
>>637
どんな感じです?
できたらイメージ貰いたいです
2018/08/01(水) 06:25:06.11ID:IkENlkBK
new a
new b(a)
new c(a)
2018/08/01(水) 07:48:14.65ID:3Ruau8S/
jdk11 ea でローカルswing アプリテストしたいのですが、
・jdk11 ea openjdkを取ってくる
・展開して適当なパスに置く
・path/to/openjdk/bin/java -jar myapp.jar
で起動出来るのでしょうか?
641デフォルトの名無しさん
垢版 |
2018/08/01(水) 10:26:14.54ID:198aEqhp
やってみりゃいいじゃん
642デフォルトの名無しさん
垢版 |
2018/08/02(木) 02:22:35.17ID:reX89mAv
通信の優先度を決める事はできますか?
でかいファイルを送受信するけど、他のアプリに影響を出したくなくて、
低い優先度で送りたい。
643デフォルトの名無しさん
垢版 |
2018/08/02(木) 02:39:35.74ID:vClc7nAi
>>642
自分でゆっくり送ればいいのでは?
2018/08/02(木) 07:50:56.22ID:yvP4ulwr
プロセス・スレッドの優先度は、設定できないの?
2018/08/02(木) 08:06:14.31ID:SwjRc7UR
プロセスの優先度は知らんがスレッドの優先度なら
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Thread.html#setPriority-int-

// コードが走ってるスレッドの優先度を変える
Thread.currentThread().setPriority(priority); // 0(MIN_PRIORITY) ~ 10(MAX_PRIORITY)

// 生成したスレッドの優先度を変える
Thread thread = new Thread(runnable);
thread.setPriority(priotrity);
thread.start();
2018/08/02(木) 08:10:14.12ID:lJdnLKf/
通常プロセスはOS側で管理するべきと思ってるからあまり考えたことないな

どうしてもやりたいなら通信を管理するプロセスを作れば良い
つまり>>643
2018/08/08(水) 20:48:19.34ID:Y8NXA7MO
アンドロイドアプリを作りたいのですが
数か月の間、メンターになってくえれる人を探そうと思ったら
どんなサイトで募集すればいいのでしょうか?
2018/08/08(水) 21:34:50.44ID:hdmbPKpc
俺がなってやろうか?
3ヵ月240万円でいいよ
2018/08/08(水) 21:38:15.67ID:oyXSOhRB
メンターなんて言葉一般的に使うの?
自己啓発セミナーみたいでいやだなあ
あ、ボクはアナルオナニーインストラクターです
2018/08/08(水) 21:40:40.73ID:Y8NXA7MO
基本料金1か月3万円でお願いします
あとはオファーにより別途請求というシステムで
2018/08/08(水) 22:33:01.96ID:D/rM6Nrn
マンツーマンで教えるとなると時給の最低ラインは3000円だから
月3万円だと月10時間、1日15分ぐらいだな
652デフォルトの名無しさん
垢版 |
2018/08/09(木) 10:10:38.81ID:gFPymi4k
専属の人を雇うとなると家庭教師雇うみたいなもんだから高くなるのではないか?
本やネットで調べながらでも何れはできるようになる事についてそこまで投資する必要があるのか?
何らかの期限があるなどして早く覚えないとまずいということか?
2018/08/09(木) 10:33:41.65ID:SPEbgWbN
パソコン教室に行って来い
654デフォルトの名無しさん
垢版 |
2018/08/09(木) 16:50:59.46ID:bgFYGL9Q
synchronizedListはイテレータがスレッドセーフじゃないといいますが
for(int i=0;i<list.size();i++)
Element e = list.get(i);

もしsizeの増減が無い場合、こんな書き方はスレッドセーフに全要素にアクセスできますか?
2018/08/09(木) 18:59:15.93ID:e0VFp9K8
できません
sizeを確認してからgetするまでに要素数が変化する可能性を排除できていません
2018/08/09(木) 18:59:52.71ID:e0VFp9K8
あ、ごめん
サイズ増減なしって条件書いてあったね
2018/08/09(木) 19:02:22.63ID:e0VFp9K8
それはサイズが既知でgetしか使ってないのと同じで安全
ていうか要素が変化しないならスレッドセーフではないLinkedListでさえ安全に使えるでしょ
658デフォルトの名無しさん
垢版 |
2018/08/18(土) 22:43:41.07ID:01sV26bM
https://github.com/OpenHFT/Chronicle-Network
ここに出てくる"Wire"ってどういう意味ですか?
WireTextだの、WireEchoだの。
たぶんプログラミング界隈の用語だと思うんですが
659デフォルトの名無しさん
垢版 |
2018/08/18(土) 23:10:04.14ID:ddghJ7gy
ネットワークを繋ぐ線の概念なんじゃないかな
知らんけど、それっぽいと思った
660デフォルトの名無しさん
垢版 |
2018/08/18(土) 23:30:49.48ID:01sV26bM
meta -> meta.write(() -> "tid")

こういう記法は何を意味しますか?
(arg) -> code
みたいなのはラムダ式の説明で出てきますけど、metaはカッコがついていません
661デフォルトの名無しさん
垢版 |
2018/08/18(土) 23:35:11.85ID:01sV26bM
Wire Message = 電報 ⇒ 通信されるデータ
WireType.TEXTとかWireType.BINARYがあるから、たぶんまさにそれだけの意味。
Network = Wireくらいの意味でこの人は使ってそうです。
662デフォルトの名無しさん
垢版 |
2018/08/18(土) 23:39:59.88ID:ddghJ7gy
>>660
引数が1つのときはカッコを省略できるんよ
663デフォルトの名無しさん
垢版 |
2018/08/18(土) 23:58:07.43ID:01sV26bM
数千もの通信を同時処理する高性能なネットワークライブラリを探してるんですが、
何が良いんでしょう?Nettyは内容が難しすぎるんですが・・・。
難しいというか、必要としてるのは単にバイナリを送受信できればいいだけなので、
無駄に高機能過ぎる。
しかし、KeepAliveとか、サーバーが常駐してメッセージを受信してイベント起動、
とかは必要で。ネットワークライブラリの中身なにやってるかあまり詳しくないんですが。

Chronicle-Networkも良く分からない。
// the tid must be unique,
final long tid = tcpChannelHub.nextUniqueTransaction(System.currentTimeMillis());
System.currentTimeMillis()を使ったら、複数クライアントにおいてtidが重複するけど、
それでユニークといっていいのかどうか。
ちょっと情報が少なすぎるのでこれも無理そう。高速らしいんですが

Kryonetは、性能不足ですね。アップデートもされてません。

やはりNettyを頑張るしかないかもしれません。
664デフォルトの名無しさん
垢版 |
2018/08/19(日) 00:00:33.27ID:bn6Y5y/t
>This comes at the cost of scalability for large number os connections. In this situation, this library should perform at least as well as netty.
これは多数のコンピューターからの同時接続ではNettyと同等の性能しかでない、
ということでしょうか?
想定してるのは1コンピューターとの高速な通信ということでしょうか。
2018/08/19(日) 00:24:40.63ID:wM6XArJ0
WebSocket とかじゃないの?
666デフォルトの名無しさん
垢版 |
2018/08/19(日) 10:44:02.78ID:bn6Y5y/t
やっぱり高性能なJavaのネットワーキングライブラリはNettyが有力のようです。
あと、Wire Messageは、たぶん「頭4バイトにINT入れて、次8バイトにLONG入れて」みたいな
バイト配列にデータを敷き詰めてく感じの行為をWireというのだろうと。
2018/08/19(日) 11:22:52.85ID:yNrD+B/d
よかったね(LOL)
668デフォルトの名無しさん
垢版 |
2018/08/19(日) 15:48:44.36ID:bn6Y5y/t
PooledUnsafeDirectByteBufとは何ですか?
Handlerでbyte[]やByteBufなどクラスを限定できますが、
単にbyte[]を使うことと比べてByteBufやPooledUnsafeDirectByteBufは何かメリットがありますか?
669デフォルトの名無しさん
垢版 |
2018/08/19(日) 16:16:30.55ID:bn6Y5y/t
どうやら単にbyte[]を送りたい場合でもByteBufを通すのが普通みたいですね
でもそれだとByteBufを作るときもそこからbyte[]を読み取るときもコピー操作があるようで遅そうです
通信に比べればメモリ操作による遅れは微々たるものかもしれませんが
Nettyより高速と謳うライブラリがありますがやはりバッファ周りの問題を指摘してましたが
これですかね
670デフォルトの名無しさん
垢版 |
2018/08/20(月) 08:34:48.22ID:nWwgLLcF
ソース読んではいないけど、byte[]のWrapperなんじゃないの?
渡されたbyte[]を丸々コピーするような、あなたのような超初心者な実装はしていないと思うよw
そもそも、byte[]で送るといっても、自分でBufferのサイズを決めたり、通信環境を考慮したり、いろいろやらなきゃいけない。
だから、そういった最適化をByteBufのサブクラスたちは提供してくれているのでしょう。
671デフォルトの名無しさん
垢版 |
2018/08/20(月) 16:30:51.58ID:x31M90y2
こういうコードがあった時、logが呼ばれてもデバッグモードでなければ
意味が無いけど、AnyHeavyMethodは計算されちゃうんでしょうか。
それとも最適化で実行されませんか?

//in some method
log(""+AnyHeavyNoEffectMethod(o));

public void log(String s){
if(isDebugMode())
System.out.println(s);
}
672デフォルトの名無しさん
垢版 |
2018/08/20(月) 20:31:28.54ID:7cywDiIN
JITコンパイラは副作用がないことをどこまで調べるんだろうね
2018/08/20(月) 20:50:34.41ID:DUHqVJSw
>>671
isDebugModeの返す値が定数で、かつそこに登場してる全てのメソッドがインライン展開されれば実行されないんじゃない?
Javaって基本的に大規模アプリケーションに最適化されてて、局所的な速度よりも全体的な安定性やメモリ消費量を重視する傾向があるから、
あまり最適化には期待しないほうがいいよ
2018/08/20(月) 22:27:44.88ID:trJY4lAL
AnyHeavyNoEffectMethodが重い処理で、Java8以降ならラムダ式使うんじゃね?


log(() -> "" + AnyHeavyNoEffectMethod(o));


public viod log(Supplier<String> s){
if (isDebugMode())
System.out.println(s.get()); // ここでAnyHeavyNoEffectMethodが実行される
}
675デフォルトの名無しさん
垢版 |
2018/08/21(火) 08:43:36.63ID:VaNiE4c6
いいね。そっくりそのままDecoratorにもなってるからすっきりする。
2018/08/21(火) 09:27:43.13ID:R/vyiArT
それJavaの場合はラムダ内で外のミューダブルな変数を参照できないから微妙
677デフォルトの名無しさん
垢版 |
2018/08/21(火) 10:05:53.79ID:VaNiE4c6
どーーしても必要なら、観測したい変数をHeapに逃がせばいい(オブジェクトにぶら下げるとか)わけだけど。
Functional信者は怒りMaxだろうな。
2018/08/21(火) 12:07:34.45ID:LMQ5YiiU
>>676
変態すぎるだろ何やろうとしてるんだよ
2018/08/21(火) 12:57:56.56ID:5BiPsrnL
>>678
そう思うだろ?
これでコンパイルエラーなんだよね
int x = 1;
log(() -> x);
x += hoge();
log(() -> x);
2018/08/21(火) 15:25:34.33ID:LMQ5YiiU
>>679
当たり前だろ
何考えてんだ
2018/08/21(火) 15:30:01.19ID:LMQ5YiiU
あ、わかった
682デフォルトの名無しさん
垢版 |
2018/08/21(火) 17:51:15.05ID:NYseXeYs
>>679
完全に使い方の問題だし、マルチスレッドの問題もあるし。
JavaScriptとかできちゃうけど、それやってどうなってもしらないぞ、と。
2018/08/21(火) 17:55:00.54ID:IftEBw66
ログなら普通にある状況だろ
それを使い方の問題というならラムダをログに使うという>>674の発想が間違ってるわ
684デフォルトの名無しさん
垢版 |
2018/08/21(火) 20:09:37.16ID:NYseXeYs
ないよ。AOPとかDecoratorとか、ラムダが登場する以前からずっとやってきている話。
ラムダはそれをちょっとエレガントにできるようにしただけ。
だから、使い方の問題なんだよ。
2018/08/21(火) 22:05:33.53ID:flSi4mUH
>>684はミュータブルな変数を一切ログ出力してないの?
自身を持って無いと言い切れるなら偉そうなこと言っていいぞ
■ このスレッドは過去ログ倉庫に格納されています