Java入門・初心者質問スレ Part.3 [無断転載禁止]©2ch.net

■ このスレッドは過去ログ倉庫に格納されています
2017/04/04(火) 20:41:11.59ID:y0EcmGB0
Java初心者のためのスレッドです。

※前スレ
Java入門・初心者質問スレ Part.2
http://echo.2ch.net/test/read.cgi/tech/1478863511/
2017/05/18(木) 08:55:42.22ID:DonT+oLB
>>422
なぜ具象クラスではなくインタフェースなのかってことなら、英単語の意味のとおりインタフェースだから
この話が特に問題になりやすいのはメソッドシグネチャに使われるときと、クラスの特性を利用するときなんで、
メソッド内部のローカル変数として宣言/定義するだけで外部に影響なく使うならぶっちゃけ何でもいいよ

逆に言うと、影響が出るなら(特に)最上位のインタフェースを使ってはいけない
Map<String, String> m1() { return new WeakHashMap(省略); }
・このm1はヤバい。戻り値を普通のMapのように使ってると、GCでいきなりエントリーが消えたりする
・戻り値の型をWeakHashMapにするべき
Set<String> s1() { return new TreeSet<String>(); }
・これもヤバい。戻り値にset()すると勝手にソートされる
・戻り値の型をSortedSet(インタフェース)にすべき
2017/05/18(木) 08:57:08.36ID:X6c7i21D
汎用性も拡張性も皆無の個人レベルのゴミソースなら
いくらでもArrayListで型宣言すればいい
2017/05/18(木) 08:59:24.71ID:DonT+oLB
途中送信になっちゃった

上のような例外的なケースを除き、基本的な使い方しかしていないなら最上位のインタフェースで宣言すべき
それはコードを読む人に変なメソッドやクラス特性を使っていないから安心して使えるというメッセージになる
#バグとかはまた別の視点だよ?
2017/05/18(木) 12:35:06.27ID:hXrMTvib
>>425
詳しくありがとうございます
出来る限り最上位のインターフェースで宣言した方が安心感があるのですね
例えば(あまりないと思いますが)addとforEachしか使わないなら
ListよりCollectionで宣言した方がいいということですかね

インターフェースだけでなくクラスも同様に、出来る限りObjectクラスに近い方がいいのでしょうか
例えばListに数字を入れるならList<Integer>よりList<Number>の方がいいですか?
2017/05/18(木) 13:06:42.91ID:DonT+oLB
>>426
そういうのをやりすぎって言うんだよ
自分で書いてて不親切というか不便だと思わない?
CollectionやNumberのJavadoc読んでみ
2017/05/18(木) 13:26:08.84ID:hChOTcwf
コードによるんじゃ
2017/05/18(木) 13:27:02.92ID:hChOTcwf
>>423
setは順番を保証しないから良くないか?
2017/05/18(木) 13:30:10.52ID:hChOTcwf
>>419
.netはlistが実装を持ってるからその指摘は的を得ていると思う
2017/05/18(木) 13:30:43.70ID:7OpOK0t2
なんで.NETの話してんの?
2017/05/18(木) 14:12:31.44ID:QINyhTse
ArrayList<String> list = new ArrayList<>();

普通に上記のような書き方でも大丈夫ですか?
どう違うのかな…糞初心者が便乗で失礼しました。
2017/05/18(木) 14:42:56.14ID:DonT+oLB
>>429
setの例は確かにまずかったね
実際やってみるとわかるけどさ、SortedSetに突っ込むものはComparable実装してないと実行時例外起きるのよ
Stringは実装してるからいいけど例えば自作のComparable実装してないクラスを突っ込むSetだと死ぬ
2017/05/18(木) 16:08:06.15ID:YsT8kXyi
>>427
最大限の抽象化を目指しつつ、必要に応じて落としどころに着地させる技術が必要なのですね
何となくわかりました。ありがとうございます
2017/05/18(木) 17:27:32.89ID:X6c7i21D
中途半端に理解力の悪い馬鹿だね君は
特定のインターフェースを受け皿にするのは意味があるからやってるんだから
君のような馬鹿は凡例に倣っておまじないのように真似して使ってればいいんだよ
2017/05/18(木) 18:04:44.47ID:pcJKb7uP
>>431
ベタージャバ
2017/05/18(木) 18:07:21.85ID:pcJKb7uP
>>435
listは意味なくない?
2017/05/18(木) 18:10:00.52ID:pcJKb7uP
>>432
おけ
2017/05/18(木) 18:11:30.15ID:pcJKb7uP
>>433
なるほどねー
2017/05/18(木) 19:53:57.62ID:YsT8kXyi
>>435
わかりました
初心者はあまり疑問に思わずにとにかく慣れた方が良さそうですね
もうちょっと詳しくなってから改めて考察します
2017/05/18(木) 20:45:03.53ID:41k9t0yi
paizaってサイトいいですか?
2017/05/18(木) 21:28:09.31ID:6GwfJscL
>>441
34歳には向いてません
2017/05/18(木) 21:32:18.96ID:mhJy8/8/
paizaっつーか競技プログラミングにJavaは相性悪くないですかね?
444441
垢版 |
2017/05/18(木) 23:50:40.17ID:41k9t0yi
34歳板の住人以外の方からのレス、お待ちしています。

>>443
競技プログラミングなんですか?誰が速いとか競うんですか?
2017/05/18(木) 23:56:50.39ID:GHcWpog8
>>444
34歳板って何?
スレチにつき誘導

【CodeIQ】コーディング転職 2社目【paiza】 [無断転載禁止]©2ch.net
http://tamae.2ch.net/test/read.cgi/prog/1495051565/
446441
垢版 |
2017/05/19(金) 00:51:55.16ID:os6zJ8mg
>>445
スレ違いでしたか、すいませんでした。
リンクありがとうございます。
2017/05/19(金) 04:01:57.36ID:7cLMvP3Z
画像を読み込み、それにスタンプを張り付けて保存するGUIツールを作っています。
JFrameの左側にはコントローラーとして動作するJPanel、右側には読み込んだ画像とスタンプを表示するJPanelを配置しています。
コントローラーの操作によって画像を新しく読み込むたびに右側のJPanelを破棄し、新しいJPanelを生成するようにしたいのですが
これを実現するのに今考えているのは、コントローラーのインスタンスのフィールドにJFrameへの参照を格納しておき
コントローラーのイベントリスナーで新規読み込みを受け取ったら、JFrameからJPanelをremove()、ついでnewする、というものです。
2017/05/19(金) 04:05:15.30ID:7cLMvP3Z
続きです。

JPanelを再生成するためだけに3つのクラスをまたぐ、というのがどうもスマートに思えません。
可読性やメンテナンス性も悪い方法だと思うのですが、これ以外に良い方法が思いつきません。
もっと良い方法があるのか、それともそもそもの構造が悪いのか、どうかアドバイスをお願いします。
449デフォルトの名無しさん
垢版 |
2017/05/19(金) 04:40:07.52ID:Yy4p2hUQ
>画像を新しく読み込むたびに、
>右側のJPanelを破棄し、新しいJPanelを生成する

一々、パネルの破棄・生成を繰り返さなくても、
画像を再読み込みすれば、良いのでは?

has-a だろ。
フレームは、複数のウィジェット(UI コンポーネント)を持つ

フレームの作成(JFrameクラス)
https://www.javadrive.jp/tutorial/jframe/
2017/05/19(金) 04:58:05.99ID:7cLMvP3Z
ありがとうございます。

右側のパネルは、JPanelを継承したクラスのインスタンスで、読み込んだ画像の表示やスタンプの情報の保持を行っています。
画像を新しく読み込む場合、それらの情報のクリアもする必要があるので、パネル自体を破棄し再生成したほうが楽ではないかと思ったのです。
それよりも、すべての情報をクリアするメソッドを用意しておき、画像読み込みと同時にそれを呼ぶようにすべきでしょうか?
2017/05/19(金) 06:24:16.60ID:Yy4p2hUQ
厳密に言えば、パネルの破棄・生成を繰り返すのは、
GCの仕事が増えるだけで、無駄だけど、

回数が少ないのなら、やりやすいようにすればいい
2017/05/19(金) 07:19:36.73ID:TEDPcFuO
>>450
すべての情報をクリアするって書いてるけど、クリアするのは画像の情報のリスト1つだけだろ?
もしかして継承したパネルの中にバラバラに情報もたせてる?
2017/05/19(金) 07:56:58.28ID:QxcdFIRu
3つのクラスをまたぐっていうのは、左JPanel内で
this.jFrame.rightJPanel = new RightJPanel()
みたいなことをしてるのかな?

JFrameにreadNewImage()を作って右JPanelのnewとかの処理はそこでして
左JPanelはreadNewImage()を呼び出すだけでってのはどう?
2017/05/19(金) 08:37:45.48ID:Yy4p2hUQ
左右のパネルが、相互に依存したら、ダメ

親 → 左の子
親 → 右の子

あくまでも、親から働きかけるようにする。
つまり、階層構造を浅くする

そうしないといずれ、スパゲッティ・泥団子のように密結合し、手に負えなくなる。
設計の基本は、疎結合
2017/05/19(金) 09:09:28.77ID:bDipVMhT
極力一元管理
456デフォルトの名無しさん
垢版 |
2017/05/19(金) 09:59:04.74ID:UcTeaZgR
上司を通さず別部署に仕事頼んじゃうのはまずいみたいな話か
2017/05/19(金) 15:02:46.01ID:7cLMvP3Z
>>451
そうなんですか・・・
やろうと思えば何度でも再読込はできるので、この方法はやめておきます。

>>452
パネルのフィールドとして、画像の縦横サイズ、スタンプのインスタンスなどを持っています。

>>453
それです。
コントローラーからの操作はすべてJFrameの持つメソッドから行うようにする、ということでしょうか?
2017/05/19(金) 15:27:47.14ID:V7EPUvXw
Javaだけで2chのスレ・レス取得、スレに書き込みできるのでしょうか?
2017/05/19(金) 15:39:32.26ID:gmSWrJbX
Javaだけで作られた専ブラが既にある、後は分かるな?
2017/05/19(金) 15:53:27.22ID:TEDPcFuO
>>457
そういうのはパネルのフィールドにばらまいてはダメなやつだよ
パネルは入れ物であって中身は中身でまとめて別に管理しないと

ついでに言うと、読み込んだ画像とスタンプは同じもの
読み込んだ画像って、ユーザが選択して重なり具合が常に最背面になってるスタンプだろ?
パネルにはList<ImageInfo>みたいなものを持たせて、Listの中身を並び順で画像表示するような設計でいい気がする
リセットはListを空にして再表示だし、複数スタンプもListに追加して再表示で終わるだろ
2017/05/19(金) 15:59:47.29ID:V7EPUvXw
>>459
あったんですね
thx
2017/05/19(金) 16:28:12.16ID:7cLMvP3Z
>>454
おっしゃるとおりだと思います。
現に、現在進行形で泥団子化しているような気がします。
自分でもなんとかしたいと思っているのですが、今まで手続き型のやり方でお茶を濁してきたツケで、オブジェクト指向的な考え方に馴染めず困っています。
例えば、左のパネルを操作して右のパネルに表示されている画像上にスタンプを追加する、というような操作を考えたとき、どのように実装すればいいかこんがらがってしまって・・・
教えてくれとは申しませんので、オブジェクト指向で書かれたGUIアプリケーションのサンプルソース集などはないでしょうか。
2017/05/19(金) 16:40:46.85ID:7cLMvP3Z
>>460
なるほど、画像やスタンプの情報もオブジェクトに閉じ込めてしまうのですね。
確かにそのようにすれば初期化や並び順管理も容易にできそうです。
今は画像上のマウスポインタのx,y座標を保存する変数などもバラバラになっているのですが、これもオブジェクトとして扱えば良いですね。
どうもありがとうございます。
2017/05/19(金) 16:54:03.15ID:8fy8h9zZ
>>461
ちなみにV2Cってやつ
2017/05/19(金) 18:11:40.44ID:V7EPUvXw
>>464
どうもです
466デフォルトの名無しさん
垢版 |
2017/05/19(金) 19:01:25.59ID:UcTeaZgR
>>464
V2Cは今では2chへの書き込みできないよな。
したらばとかの2chに似ている掲示板では書き込みできるが。
2017/05/20(土) 12:30:03.29ID:MUxe8l0w
パッケージ名とクラス名を同じにしないといけないってなんで?
調べても出て来なかったし、実際違う名前にしてみても問題なく動いた
2017/05/20(土) 14:15:46.69ID:PoJQGONs
>>467
クラス名とファイル名じゃないか?
2017/05/20(土) 15:40:52.53ID:MUxe8l0w
>>468
ああごめん
そうだった
でも結局それでも動いた
2017/05/21(日) 17:41:03.62ID:yzZ9l0t7
どうでもいいことかもしんないけど、is○○って、boolean型を返すメソッド名のみに使うべき?
boolean型の変数名に使うのはNG?
2017/05/21(日) 17:57:08.86ID:1QefLJTZ
>>470
OK、Javaはメソッド名とフィールド名を区別するから関係ない
2017/05/21(日) 19:27:03.36ID:wfwMepb4
>>471
動くか動かないかではなくて、命名規則的に好ましいか好ましくないかを聞きたいです
2017/05/21(日) 19:30:34.94ID:pUWFtSb1
悪くはないと思うよ,嘘ついているわけじゃないし
2017/05/21(日) 19:38:17.39ID:LHr6gtTw
人によるといわれたらそれまでなのですが、三十代プログラミング経験無しが業務で使えるようになるにはどれくらいかかると思いますか?
2017/05/21(日) 19:47:45.48ID:zNfd0kUp
出来るからって区別しないのはキモい。
日本語で変数書いても悪く無いけど、キモいでしょ。
俺俺ルールならメソッドはisXXX。
変数やフィールドはXXXflgとかXXXflagとかにしてたな。

bool型の変数やフィールドにこう付けろって慣習はJavaは無かった気がする。
Cだとflgやflagで付ける慣習(ってほどでも無かったけど)あったから、おいらはJavaでもそうしてただけだが。

ずっとずっと昔の話だが。。。
2017/05/21(日) 19:48:50.69ID:RUGjRrqs
>>474
スレチ
てゆうか君>>441とか>>348の人でしょ
なんでJavaスレでそんな質問するんだよ
スレタイ読める?
ここはJavaの初心者スレであってネット初心者スレではないんだけど
2017/05/21(日) 19:49:58.64ID:Ku4JySDo
人によるし業務によるとしか
なんの根拠も無いけど半年を目安にして貰ったら良いんじゃないかな
2017/05/21(日) 20:00:57.93ID:zNfd0kUp
>>474
まあ長くて一年で才能ある人は何かしらゲーム作れてるよ。
ジャンケンとかの簡単なのじゃなくて格ゲーみたいなの。
具体的には同級生がそう言う人種。
2-3ヶ月で作れてた気もするが。

一年で出来ない奴は、おいらみたいに10年経ってもショボいツールしか作れない。
2017/05/21(日) 20:36:10.10ID:KT6Xsd7k
>>476-478
申し訳ありません。
業務と平行しながら勉強してるのでここでいいかなと思いまして。

なかなか身に付かず焦って質問してしまいました。半年から一年を目処に頑張ります。
2017/05/21(日) 21:17:08.99ID:8VZiX6Z0
>>479
次からはこっちで質問すると良いよ。

スレ立てるまでもない質問はここで 147匹目 [無断転載禁止]©2ch.net
http://echo.2ch.net/test/read.cgi/tech/1490436082/
2017/05/22(月) 08:09:37.82ID:rV93qz9q
Windows+Java環境下でFFTを計算したいのですが感染性が無く再配布可能なライセンスのライブラリってありますか?
2017/05/22(月) 09:22:38.69ID:4kDceHI4
>>481
ググったらファイナルファンタジータクティクスが出てくるぞ?
それの何を計算するんだ?(笑
とか言われないように略称じゃなくてきちんと書けやアホ

あとなぜライセンスにこだわるんだ?
作ったもので金とるからって理由なら調査費用くらい惜しむなよ
2017/05/22(月) 09:29:07.58ID:mjjAkcu0
高速フーリエ変換通じないのは流石に通じない方が悪いし、通じない奴は質問の対象者じゃないんだから黙っとけよ
484デフォルトの名無しさん
垢版 |
2017/05/22(月) 10:30:45.35ID:1JJhboIc
プロゲートで無料のぶんだけひととおりやったんですがこんな単純なものだけで組み合わせたら色々できるの?
2017/05/22(月) 10:57:24.88ID:cucl6upm
プログラミングは言語は何であれアイデアや応用の世界だからな
486デフォルトの名無しさん
垢版 |
2017/05/22(月) 11:14:41.72ID:tvdR/xt5
「アホ言うやつがアホ」という言葉がまた証明されたようだな
2017/05/22(月) 12:09:31.25ID:P/AfA+PI
>>482
そんなこと言うやつがクソだろ
488デフォルトの名無しさん
垢版 |
2017/05/22(月) 14:14:19.86ID:1JJhboIc
難しいものを作るには難しいプログラムが必要じゃなくて簡単なものの組み合わせ方って言うことなの?
2017/05/22(月) 14:23:39.87ID:cucl6upm
何をイメージして難しいとか言ってるんだ?
490デフォルトの名無しさん
垢版 |
2017/05/22(月) 14:53:57.12ID:d6K1UVaP
ま、そうだな。難しい漢字みたいなものだ。
分解すると一つ一つは簡単なカタカナみたいなやつでしかない。
2017/05/22(月) 16:08:03.03ID:3W7nNBo7
難しいものってのが何なのかによるんじゃないかね
計算量が膨大なものならそれなりに難しいアルゴリズムも必要になるだろうし
Javaでそこまで踏み込むかはわからんが
2017/05/22(月) 16:23:53.42ID:PfanrHfD
>>481
これなんかどう?
http://hp.vector.co.jp/authors/VA046927/fft4gjava.html
2017/05/22(月) 19:43:15.47ID:rV93qz9q
>>492
おぉ、ありがとうございます。試してみます
2017/05/22(月) 20:00:29.53ID:Zgh5eQVH
>>482
FFTもしらないなんて‥
2017/05/22(月) 20:02:50.44ID:Xg9/hZFe
>>482
一番上に高速フーリエ変換のWikiが来るじゃねーかw
2017/05/22(月) 20:10:28.65ID:mjjAkcu0
Googleって検索者がよく調べてるものの関連のものが上に来るんだっけ?
2017/05/23(火) 04:57:47.00ID:ZEoEO5ey
FFT っていう単語を知らないなら、さすがにヤバイ、レベル

Matlab などの数値計算なら、Python

tmpnb
Jupyter Notebook (IPython)
2017/05/23(火) 19:41:11.76ID:i368ua84
Rubyのpメソッドみたいに
変数の中身や配列の中身を手軽に確認できるメソッドって無いのでしょうか
特に配列の中身を確認する方法が分からず、デバッグをする際に苦労するのですが・・・・・・
2017/05/23(火) 20:01:14.31ID:nu8Noumz
>>498
Arrays#toStringもしくはArrays#deepToString使えばおk
RubyみたいにpはないけどIDE使えばsysoutとかsoutから補完できるぞい
2017/05/23(火) 20:01:46.83ID:0KCdNJNi
Arrays.toString(調べたい配列)をよく使うわ
2017/05/23(火) 20:26:13.35ID:nu8Noumz
そういやスタティックメソッドだから#じゃなかった
2017/05/23(火) 20:52:26.34ID:+maOq34X
日付と時刻を表示するプログラムを作ったのですが、時間の表示がおかしいです。
なぜでしょうか?
https://ideone.com/Osdsox
2017/05/23(火) 21:00:51.52ID:i368ua84
>>499
ありがとうございます
その二つを使ってチェックしていきたいと思います

>>502
デフォルトだと日本時間ではなく、グリニッジ標準時間 (GMT)になるので
時差の分ずれてると思われます
2017/05/23(火) 21:02:43.60ID:IEg1DOoE
>>502
IDEONEの鯖のタイムゾーンがGMT仕様だからじゃないかな、多分手元で実行すれば大丈夫
2017/05/23(火) 21:03:25.21ID:IEg1DOoE
あ、すまんこれシステムのタイムゾーン取ってるわけじゃないのか
506デフォルトの名無しさん
垢版 |
2017/05/23(火) 21:15:24.77ID:RzWtz9Yc
ほんとだ
https://ideone.com/qKqvOz
507502
垢版 |
2017/05/24(水) 00:25:16.54ID:PoyHH2+7
レスをくれた方、ありがとうございました。
>>506の方のリンクやスッキリJava実践編を参考に改良してみたいと思います。
2017/05/24(水) 17:28:31.44ID:rgjqqiZm
https://ideone.com/TgG170

配列の中身を拡張for文表示させようとした際に
上記のように上手く行かないのですが、なぜなのでしょうか?
2017/05/24(水) 18:14:51.41ID:oppUfTVj
>>508
System.out.println(i);
2017/05/24(水) 18:51:24.14ID:NmDuToTQ
>>508
その文脈でのiはループ変数ではなく配列のそれぞれの要素そのものだから、>>509の書き方をすればいい
まぁそもそもループ変数じゃないんだからiなんて名付けちゃいかんね
nくらいにしとくといいよ
2017/05/24(水) 19:16:31.99ID:rgjqqiZm
>>509>>510
ああ、ループ変数ではなく、そのまま要素になるんですね
混同してしまいました
勘違いしないようにもっと分かりやすい名前をつけるようにします

ありがとうございました!
2017/05/24(水) 19:57:10.67ID:2FV//qQH
拡張for文をちゃんと理解して
numsから要素取り出してるだけだから
iは1,2,3でnum[i]は2,3,範囲外例外になってるだけだよ。
2017/05/24(水) 23:15:42.47ID:CMr8dFBK
propertiesファイルを読み込んで、そこからenumを生成するようなことは可能ですか?
つまり

#Animals.properties
enums=DOG,CAT,HUMAN, ...

と書かれたファイルを読んで

enum Animals {
    DOG,
    CAT,
    HUMAN,
    ...

となるようにしたいのですが
514デフォルトの名無しさん
垢版 |
2017/05/24(水) 23:21:34.43ID:0Qc+9z9K
   ∩___∩
   | ノ      ヽ
  /  >   ● |    ムリ☆
  |    ( _●_)  ミ
 彡、    |∪|   )
/      ヽノ //
ヽ|       /
 |       /
 ヽ /  /
  / /ヽ
(´_ /ヾ_)
2017/05/24(水) 23:30:40.23ID:CMr8dFBK
やはり無理ですよね・・・
ありがとうございました。
2017/05/26(金) 09:43:02.44ID:AcHukEBi
型のメソッドdatetime(Timestamp)は引数(Timestamp)に適用できませんって出るんだけどどうしたらいいのか教えてください
2017/05/26(金) 12:02:24.51ID:eKd8m2Nz
適用できないのでどうしようもありません
2017/05/26(金) 12:47:00.31ID:7lZclfT9
違うpackageのTimestampを引数に使ってるんじゃね?
2017/05/26(金) 12:52:15.67ID:R5Fz6uU5
ideoneにでもソース上げた方が早そう
2017/05/26(金) 13:53:37.24ID:AcHukEBi
>>518
うん、違うパッケージで書いたゲッター、セッターに値を入れようとしてる
2017/05/26(金) 14:15:00.54ID:eKd8m2Nz
アホの子かな?
2017/05/26(金) 14:23:54.10ID:AcHukEBi
ごめん、間違ってた同パッケージ内の他クラスに値を入れようとしてるんだ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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