★★Java質問・相談スレッド181★★
■ このスレッドは過去ログ倉庫に格納されています
プログラミング言語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/ どーーしても必要なら、観測したい変数をHeapに逃がせばいい(オブジェクトにぶら下げるとか)わけだけど。 Functional信者は怒りMaxだろうな。 >>678 そう思うだろ? これでコンパイルエラーなんだよね int x = 1; log(() -> x); x += hoge(); log(() -> x); >>679 完全に使い方の問題だし、マルチスレッドの問題もあるし。 JavaScriptとかできちゃうけど、それやってどうなってもしらないぞ、と。 ログなら普通にある状況だろ それを使い方の問題というならラムダをログに使うという>>674 の発想が間違ってるわ ないよ。AOPとかDecoratorとか、ラムダが登場する以前からずっとやってきている話。 ラムダはそれをちょっとエレガントにできるようにしただけ。 だから、使い方の問題なんだよ。 >>684 はミュータブルな変数を一切ログ出力してないの? 自身を持って無いと言い切れるなら偉そうなこと言っていいぞ ちなみにログ出力にJavaのラムダが適していないという話であって、ラムダがミューダブルな変数を参照できるべきだなんて誰も言ってないけど >>684 は勘違いしてる 簡単な実験コード書いてみたけど最適化されませんね。 private static final boolean debug = false; @Test public final void testOptimization() { final long start = System.currentTimeMillis(); log(anyHeavyNoEffectMethod() + ""); final long end = System.currentTimeMillis(); System.out.println((end - start) + "ms");//50ms } private static final void log(final String s) { if (debug) System.out.println(s); } private static final long anyHeavyNoEffectMethod() { final Random r = new Random(); long total = 0; int loop = 1000 * 1000; for (int i = 0; i < loop; i++) total += r.nextLong(); return total; } ラムダ式の方はanyHeavyNoEffectMethodが呼ばれません。 しかし、指摘のようにミュータブルな変数を渡せません。 log()の実装を二種類用意して使い分けていくのが妥当な気がします。 デコレーターパターンで解決できるんですか? このような頻出のパターンについてJITは最適化すべきだと思います。 たぶん、それが一番妥当な解決策です。 副作用が無い事を確認する機能は、JITに既にありそうなものです。 少なくともある程度の範囲で副作用が無い事を確認できるはずです。 どうでもいいんですがこんなパターンにはJITは最適化を見せました。 for(){ list.add(i); list.remove(i);//追加したものを即削除する } オーバーロードでいんじゃない? ログの出力ってきほんStringじゃん 匿名クラスとかでスタック領域の変数を参照できますが、匿名クラスのオブジェクトが破棄されるまでそれらは生存するということですか? public void method(Observable obs){ Object o = ...; EventHandler handler = new EventHandler(){ @Override public void handler(){ System.out.println(o); } } obs.setOnAction(handler); } >>691 気のせい 実は無名クラスの中に隠しフィールドが生成されてoの値をコピーしている ちなみにoは暗黙的にfinalになっており、後でoを書き換えようとするとコンパイルエラー そこまでするならScalaやKotlinやC#みたいに最初からoをヒープに作っちまえよと思わなくもないが、 この中途半端な仕事かJavaクォリティ >>691 そうなるよ、参照関係を図で表すとこうな感じでしょ https://light.dotup.org/uploda/light.dotup.org543719.png オレンジが変数 緑がオブジェクト メソッドを抜けてローカル変数o, handler, obsがなくなっても Observable → EventHandler → Object の参照は消えない 引数に渡してるObservableはメソッドの外で 変数から参照されてるだろうからメソッドを抜けても 破棄されないよ >>693 691が気にしてるのはローカル変数o自体の寿命でしょ 実際には無名クラスの外側にある変数oとhandlerの中で参照してる変数oは別の実体だから問題ない、が答えだよ 後者は>>692 の通り無名クラスの隠しフィールドであり、インスタンス生成時に値をコピーしている この仕様だと、後で内側または外側でoの値を書き換えてしまうと辻褄が合わなくなるから、 oを後で書き換えてはいけないという制限が必要なの ここを見るとRSA系は2048までしかありません。4096等だとRSA鍵による暗号化ができないということですか? その場合、非標準のライブラリ等で解決できますか? https://docs.oracle.com/javase/jp/8/docs/api/javax/crypto/Cipher.html RSA/ECB/PKCS1Padding (1024、2048) RSA/ECB/OAEPWithSHA-1AndMGF1Padding (1024、2048) RSA/ECB/OAEPWithSHA-256AndMGF1Padding (1024、2048) 強度の強い暗号化は輸出制限あるから気を付けてね。 うっかりノートPCにセットしたまま他国へ持って行こうとするとバレた時に大変まずいことになるかも知れない。 jre1.8の最近のバージョンでデフォルトで強度無制限になったようです。 とはいえ、java8の仕様上、2048までしかサポートする必要は無いようです。 実装によってサポートしているかもしれません。 このようなコードがあった場合、tは生存しますか? tはどこからも参照されてないとします。 //in some method Thread t = new Thread(){...}; t.start(); return; >>699 試してみた https://paiza.io/projects/PxoO2-fLSd_KfpwF5B3prA 結果からわかることは ・メソッドを抜けてもスレッドが終了するわけではない ・スレッドが終了しないならばプロセスは終了しない ・ローカル変数がなくてもスレッドを取得できる 作成したスレッドのオブジェクトはどこかに保持されるみたいね tは生存します、が答えっす threadは、main thread同様garbage collectionのrootとして扱われるそうなので、生存しまする Eclipseとかいう汚物にJavaFXを入れたく思いマーケットプレースでjavafxで出てくるe(fx)clipseをインストールしようとしたところ長時間待たされた挙句にエラーが出ました どうすればいいでしょうか? >>704 JavaFXは廃止されたから使っちゃダメ 厳密には廃止ではなく分離とされてる。 あとJava8が2020年までサポートだから、2020年までは1.8系のjreがあれば使える。 そもそもJavaの未来はどうなるのか。JREが有償化される。 OpenJDKはインストーラや自動アップデータが提供されるのか。 JavaFXは単体のライブラリとして独立できるはずだが、誰かがやるのかどうか。 現状だと、何やら面倒なインストール手順が必要なようで、 デスクトップアプリに使われるであろうJavaFXにとって致命的なはず。 mavenとかを使ってアプリに気軽に同梱できるものになればいいのだが。 JavaFX will continue to be supported in the future by the company Gluon as a downloadable module in addition to the JDK. このスレではJavaFXをオヌヌメします JavaFXをオヌヌメしないのはoracleのコウサクイン JavaでデスクトップのGUI環境自体どうなんだ? downloadable moduleってなんだろうな。 そもそも後方互換性を捨てて高速リリースとか言ってるのが怖くて仕方ない。 開発者が最新版に対応したって、エンドユーザーが最新版を持ってるか分からない。 どのバージョンに向けて作ればいいんだ? いやクロスプラットフォームGUIという概念は重要でしょ。 Java8+JavaFXは2022年までサポートされるってかいてあるな だからもう少し先の話ではあるし、人気のある環境だからそれまでに整備されるだろう。 AndroidでもJavaFX動くみたいだし、クロスプラットフォーム性という面で やはり一番優れてるよJavaは ちなみにJavaやKotlinのコードをネイティブコードにするコンパイラがあって iPhoneでもJavaやKotlinのソースコードで動かせるみたいだぞ ちょっと前までiPhone用のJVMもあったんだけどな https://www.oracle.com/technetwork/jp/java/eol-135779-ja.html Java8 個人ユーザーの公式アップデート終了日 2020-12 このときまでにOpenJDKやGluonのインストーラが登場していなければ困る。 そしてそれが自動アップデータを搭載していなければ。 ところが自動アップデータ搭載されてても、後方互換性を捨てたアップデートを勝手にされると困るw 困りまくりだ OpenJDKに自動アップデータが提供されたとする。 OpenJDKのアップデートがアプリのアップデートを先行する →勝手に互換性を捨てたアップデートが来てアプリが動かなくなる。 アプリを最新版に対応してリリースしてもアプリのアップデータは動かないw アプリのアップデートが先行する →エンドユーザーのOpenJDKが古くて動作しない だから、互換性を捨てて高速リリースとかいってるのはほとんど意図的なJava界隈への攻撃。 一番欲しいのは、Java8のサポート継続&自動アップデート継続&互換性の維持。 APIを変更するならdeprecatedの期間をある程度とってくれないと無理。 高速リリースがうれしい人が居るのか? .netと同じ道を歩んでるようにみえて microsoftの.netはMITライセンス OpenJDKのリンク例外つきGPLは十分だろ。 OpenJDKにおいて、互換性を考慮したアップデートが行われ、自動アップデータが提供されるか。 GPLだから誰でもそのプロジェクトをやれる。 >>720 の解決法はこうだ OpenJDKの次期バージョンで現在のアプリが問題を起こすかチェックする。 →問題があるならOpenJDKがアップデートされる前にアプリをアップデートしておく。 そのアプリの修正は、現在のOpenJDKと次のOpenJDK両方で動作する事を確認する。 もうJavaで書いたアプリがあるし、Javaに慣れてるから。 それに、.NETに移ったとして、同じ事が起こらない保証があるのか? 実は俺はこの問題に対する根本的解決策を知ってる。うまくいくかは知らないが それも含めて考えると、やはりJavaを続けようと思える。 リリース前でもビルドが公開されてるだろうと思ったけど。 プラットフォーム系でプレビューリリースとかアーリーアクセス的なものを提供して 予め対応してもらおうというアイデアは一般的なもので、オラクルがOpenJDKをサポートするなら たぶんやるだろう、というか既にやってると思うけど。 JDK 11 Early-Access Builds http://jdk.java.net/11/ 大前提の認識が間違ってるぞ。 Java11以降においては無償のスタンドアロンなJREは無くなるんだよ。 デスクトップ用途なら開発者自身がアプリにJavaランタイムを組み込んで配布することが推奨される。 そして、OpenJDKはエンドユーザーが自分で個人端末にインストールするようなことを想定したものではない。 開発者がシステムに元々入っているのOpenJDKに依存してよいのは、業務システムなどで 開発者が完全に実行環境のOpenJDKディストリビューションのバージョンや構成を制御できる場合のみだ。 https://docs.oracle.com/javase/jp/8/docs/technotes/guides/deploy/self-contained-packaging.html#A1307236 >自己完結型アプリケーション・パッケージは、プラットフォーム固有で、ビルドしたシステムと同じシステムにのみ作成できます。 各プラットフォーム向けにビルドしなきゃいけないようだ >自己完結型アプリケーションには、自動更新の組込みサポートがありません。 アプリのアップデータで簡単にアップデートできるなら問題ではない。 アプリへのJREの組み込み手段がサポートされて、 そこでJavaFXがサポートされるなら、問題無い気がする。 JavaFXはそこでサポートされなきゃ意味が無いし。 >Java SE 8は、デスクトップ展開を対象とした最後のJava SEリリースです(Java Web StartやスタンドアロンシステムJREなど)。 こういう文言もあるから、Java11以降、OpenJDKでJavaFXみたいな デスクトップ展開がサポートされるのかどうか。Java8最終版を組み込んで使い続けるか Gluonに期待するか。 初心者だけどJavaFXでFTPサーバーとやりとりして追加したり一覧表示してダウンロードしたりするwindows用アプリを作りたいんだ apache commons netというライブラリを使ってやろうと思うけどviewにファイルを入れるにはどうすれば良いんだろう? 入れた後はjavaからviewをインスタンス化してその中の変数の値(ファイルのパスかな?)を取り出してって感じでなんとかなりそうだけど... 本当に何も分からない状態で、何か良い勉強方法は無いかな? FTPサーバーについても素人に近いよ そういや今はJavaは標準のライブラリでFTP接続してアップロードとか楽にできるクラスあるのかな? ダウンロードだけはURLクラスでできるの知ってるが。 viewにファイルを入れるってなに? TableViewとかTreeViewクラスにアイテムを表示する方法ならチュートリアルあるでしょ ああ解読できたかも 要するにGUIにアプリから値を設定、ないし アプリからGUIに値を設定するにはってことでしょ? てかGUIってそういう使い方しかないし。 そんなのぐぐればいくらでも出てくるのでは。 https://docs.oracle.com/javase/jp/8/javafx/user-interface-tutorial/table-view.htm 訂正 人→GUI→アプリ アプリ→GUI→人 この流れがやりたいってことだとおもわれる >>739 そうそんな感じ 全然イメージ出来ん どうやって起動させるの? でも公式ドキュメント見やすそうだねありがとう Project Loomを急ぐんだ! はやく第一級継続を書かせるんだ。 どうか限定じゃありませんように イメージできんってもなあ・・・ GUI部品クラスが提供されてて、何らかの値の設定方法、取得方法があるだけじゃん。 StageやSceneクラスという、GUI全体を意味するクラスも提供されてる。 そこにGUI部品を積み上げてくだけだぞ。 起動って・・・IDEのプロジェクトアーキテクチャの選択でfx系選べば何もしなくても GUI立ち上がるでしょ >>743 webアプリならサーバー起動させてコントローラにある接続用のurlをブラウザに入れれば始めれるじゃん これはメイン関数なくても行けるんでしょ?起動ボタンあるの? 何かの障害持ちだと理解の過程が通常と違う 彼らにネットは不向きだと思う なんというか、Windowsならftpアプリなんかわざわざ作らんでもWebブラウザやエクスプローラでURL指定して開いちゃえばいいような気がするが・・・ あ、とにかく作ってみたいのか。 >>747 ピュアな ftp ならプロトコルも対して難しくもないからネットワークの練習にはちょうどいい gluonとopenjfxが両方javafx11ビルドしてるけどこれ同じバイナリだろうか? >>5 8のreplaceは正規表現を使ってて馬鹿みたいに遅いから気をつけろ >>749 JavaFXはもうJavaの一部ではないのでこのスレのスコープ外だよ 専用スレか公式フォーラムで聞きなさい >>750 それはreplaceFirst()だろ 調べてみた @since 1.5 replace(CharSequence target, CharSequence replacement) @since 1.4 replaceAll(String regex, String replacement) @since 1.4 replaceFirst(String regex, String replacement) replaceは正規表現使ってなかった 資格に関する質問ってしてもOK? Oracleの「Java SE 8 Silver」の試験勉強をしようと思うんだけど、参考書に迷ってる 4月からjavaを学習してる程度の人が「徹底攻略 Java SE 8 Silver 問題集」をやるのは難易度高い? 書いてて宣伝っぽい文章になったのはごめん 有料だから注意しろよ 無料で落とせるやつはちゃんとLAに「評価と開発以外の目的に使うな」と書かれてる そんな大事なことをダウンロードページに明記してなくてLA読まないと分からないようにしてるのは流石天下のオラクル様ですわ OpenJDK11があるじゃん。そのうちAdapt OpenJDK11もでるだろ。 だいたいダウンロードページにOTN開発者ライセンスに変わったって書いてあるし JavaでJson読ませるの、どのライブラリが使い勝手いい? なんかいろいろありすぎて困る >>762 JSR 374がjaxpに似せてるから学習コスト低いよ。 ttps://javaee.github.io/jsonp/ 質問です。 下記のコードで、 https://ideone.com/0RbRo7 出力が0と0の間で2行開いてしまっているのですが、これはなぜでしょうか? System.out.printlnをSystem.out.printにすると空白は出ないのですが…。 区切り文字を{},の3文字にしてsplitしたからでしょ。 >>765 >>766 >>767 返信ありがとうございました。 また質問させて頂くかもしれませんが、よろしければその時もまたお願いします。 http://acro-engineer.hatenablog.com/entry/2013/10/17/113216 >MyProtocolClientHandler extends ChannelInboundHandlerAdapter Inbound 受信時に使用される処理 Outbound 送信時に使用される処理 という理解なんだけど、クライアント側のInboundはレスポンスを受信するときに動くということ? でも送信時のコードが書かれてるようで、分からない。 NettyのInbound, Outboundとは? Inbound:中国人の観光客 Outbound:日本人の海外旅行 ああわかりました channelActiveは返信等を受け付けれるような状態になった時に呼び出されて、 それはinbound,outbound関係無いってことですね パイプラインのハンドラーというより、メッセージ送信の コントローラー的なものがそこに書かれてるということですね たまたまハンドラのイベントにそういう処理が書かれてる https://netty.io/4.0/api/io/netty/channel/ChannelDuplexHandler.html > intercept operations and also state updates この部分どういう意味ですか?intercept operationとは? DuplexHandlerはパイプライン上でどういう順序で実行されますか? 受信時と送信時で実行して欲しい順番が異なる場合どうすれば? bronzeの問題集やっててイライラしてきたんだけど、問題になるようなコードは基本的に書くなってことでいいんですよね? &&||の右側にインクリメント演算子書いたから場合によって評価されないとかif文の中身1行しかないからカッコ省略したら読みづらくなってるとか 問題として出されるくらいヒューマンエラーを産みかねないってことでOK? 読めるようになれってことじゃないの? >&&||の右側にインクリメント演算子書いたから場合によって評価されない 例えばこれは、 if(a != null && a.get()>1) こんな行があった時に2つ目の演算でNPE起きない事が保証されると分かれ、ということだろう 書くな、じゃないよ。こんなコードたくさんあるし、こう書かないと冗長になる >>775 演算子のほうはちゃんと意味考えて書けよってことですよね?って聞いたつもりだったんです、言葉足らずでした 評価されない場合使って簡潔に書くのはよくあることなんですかね 中身1文ブロックのカッコ省略のメリットがさっぱりわからないんですが見た目がすっきりするだけですかね……? どこ読んでもあえて推奨されてることがなくて、ブログのコメント欄とかはだいたいケンカになってるんでこれはあまり触れてはいけないアレなんでしょうか まあそれは簡単に言うと 開発時のソースコードはデバッグ出力の行があったりするんだけど リリース時はデバッグ出力の行を文字列置換で一掃したりする。で、もし if(...) debugLog(...); こういう行があったとして、debugLog(...);を置換で削除したら、エラーになる。 if(...){ debugLog(...); } これは置換しても大丈夫。 だから、括弧無しは処理部分を置換する事があるか、による 経験上置換するのはデバッグ系コードだけ ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる