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

このエントリーをはてなブックマークに追加
699デフォルトの名無しさん:2014/07/15(火) 21:04:57.58 ID:9VKpzEO8
別に事前に100%正解を出す必要はないでしょ
実装無しで設計が完璧にこなせるなんて、それは予言に近い
ウォーターフォールの理想論を極めた感じ
十分事前設計可能な程度の小さな規模だとか
既に熟知してる分野だったら、コード書かなくてもインターフェース分かるかもしれんけど

リファクタリングでボトムアップ的に導き出したインターフェースの方が
あとからメンテしやすいことだってよくある

>>689
>クラスもimplementできるようにしてほしい
意味がわからん
IDEにもよると思うけど、インターフェース抽出なんて30秒くらいでできるだろ
700デフォルトの名無しさん:2014/07/15(火) 21:40:06.72 ID:rNvnrAj8
>>699
クラスを使ってるほうもインターフェースにしなきゃいけないじゃない
単純作業でも変更が広範囲に及ぶから結構しんどい

クラスをnewするところを除いて、どこも変更せずに
こっそり中身を入れ替えたいんだ…
701デフォルトの名無しさん:2014/07/15(火) 23:36:36.93 ID:QvL8psPf
Scala使えよ
構造的部分型があるからインターフェースなんか要らないぞ
702デフォルトの名無しさん:2014/07/16(水) 01:00:21.44 ID:BpcA+H0e
interfaceにメソッド実装できるようにならなかっけ?
703デフォルトの名無しさん:2014/07/16(水) 01:22:39.57 ID:EjWtDZsn
http://www.javainthebox.net/blog/index.html
このページクソ重いw
CPUもメモリ使用量も半端ない。
704デフォルトの名無しさん:2014/07/16(水) 01:27:44.59 ID:1+vjbdzg
そう、それなら見なければいいじゃない
705デフォルトの名無しさん:2014/07/16(水) 01:29:27.24 ID:khPWngR+
>>701
言いたいことはよく分かるぞ。最近はやっとこっちのほうが主流だからな。
けど、javaスレでstructural typeな言語使えって言われても・・・nominal type嫌いならなんでjavaスレに居るんだよ。
706デフォルトの名無しさん:2014/07/16(水) 09:21:17.73 ID:Up7cIJ0h
すんごい基本的な事かもしれんけど・・・

class testClassA{

private byte[] data;

void main(){

testClassB b = new testClassB();
data = b.getData();
b = null;
}
}

class testClassB{

private byte[] data1;
private byte[] data2;

byte[] getData(){
data1 = new byte[32];
data2 = new byte[32];
return data1;
}
}

↑の動作でb=null;した後ガベージコレクションが発生してもtestClassAのdataの中身は保持したままになってるって事でOK?
で、testClassBの中のdata1はメモリ上に残ったままになるけど、data2は他からの参照が無いって事で
ガベージコレクションで解放されるんかな?
教えてプリーズ!
707デフォルトの名無しさん:2014/07/16(水) 11:43:10.69 ID:moRTR2el
yes
708デフォルトの名無しさん:2014/07/16(水) 20:14:49.82 ID:zFDtk9Ip
コンストラクタからは呼び出してはいけないメソッドがあって
どっかのバカが、やらかしちゃったんで、それを探し出したいんですけど、
たとえばこんなの
class Unko {
 Unko() {
  foo(); // アフォが追加したコード
 }
 void foo() {
  assert なんとかかとか : "ゴルァ!コンストラクタから呼んじゃダメぽ!";
  本来の処理...
 }
}

この「なんとかかとか」に使えるスマートなコードを教えてくだしゃあ
709デフォルトの名無しさん:2014/07/16(水) 20:26:04.32 ID:/PqeR20C
>>708
assert !new Exception().getStackTrace()[1].getMethodName().equals("<init>");
710デフォルトの名無しさん:2014/07/16(水) 22:15:52.91 ID:EBYMe1aA
assertを埋め込まなきゃいけないメソッドが分かってるんだったら
そのクラスのコンストラクタ見りゃいいだけだろ
何やってんだ
711デフォルトの名無しさん:2014/07/16(水) 22:30:56.09 ID:G80bT3bq
>>710
継承が多くて探すの面倒ってことかと思った。
本質的には初期化が終わってるフラグを持って、そのフラグが立ってなかったら例外でいいと思った。
712デフォルトの名無しさん:2014/07/17(木) 04:43:45.86 ID:JRQOC2Yb
Java SE 8 update11 キター
713デフォルトの名無しさん:2014/07/17(木) 16:40:49.64 ID:pL1XllHI
1:if (Date1 < Date3 && Date2 > Date3) { res = "ok";}
2:if (Date1 < Date3 || Date2 > Date3) { res = "ok";}
ORが||だと1と2で同じブーリアンになるよね?
714デフォルトの名無しさん:2014/07/17(木) 17:11:29.18 ID:WQQLKIr2
不等号反転かつ全体の真偽値反転してるとかならともかく、
なんで同じになると思うんだ?
715デフォルトの名無しさん:2014/07/17(木) 17:47:38.49 ID:pL1XllHI
ただしDate1>Date3>Date2が条件

実際にに書いて同じになったから
716デフォルトの名無しさん:2014/07/17(木) 17:52:12.47 ID:ePEJRQuJ
そもそも何だこの質問?
717デフォルトの名無しさん:2014/07/17(木) 17:54:19.08 ID:aUrLvZEm
Javaの勉強始めましたがいきなりつまづいています。可能ならば教えて下さい。

class hoge {
...
}
があってhogeのインスタンスを作るのに
hoge aaa = new hoge()
というように、なぜhogeを2回も書かないといけないのですか?
718デフォルトの名無しさん:2014/07/17(木) 17:56:02.81 ID:CLQb5Mz9
C#ならvarがあるよ
javaはちと遅れてるね
719デフォルトの名無しさん:2014/07/17(木) 17:56:08.82 ID:pL1XllHI
普通に1で書くんだろうけど2でも同じになったから聞いてみただけ
||と|の違いだと気づいたけど合ってるよね
720デフォルトの名無しさん:2014/07/17(木) 17:59:31.95 ID:ePEJRQuJ
>>717
違う場合があるから
List<String> list = new ArrayList<>();
721デフォルトの名無しさん:2014/07/17(木) 18:02:57.10 ID:aUrLvZEm
717の続き
aaa = hoge()
や、せめて
aaa = new hoge()
って書かない(書かせない)理由が知りたいのです。

fugaってクラスもあったとして
fuga aaa = new hoge()
は当然エラーですよね
722デフォルトの名無しさん:2014/07/17(木) 18:12:11.16 ID:aUrLvZEm
>>720

ありがとうございます。
そういう生成もあるのですね。
723デフォルトの名無しさん:2014/07/17(木) 18:42:12.11 ID:pL1XllHI
new hoge()はhogeクラスのコンストラクタを呼んでるからだと思う
724デフォルトの名無しさん:2014/07/17(木) 19:23:13.26 ID:f9EwQ7K8
>>717
入れ物と中身で2回。
725デフォルトの名無しさん:2014/07/17(木) 21:19:42.68 ID:ZpRdyoCC
>>721
変数の型指定が変数宣言を兼ねてるから…
C#を使えば幸せになれる
726デフォルトの名無しさん:2014/07/17(木) 22:31:38.00 ID:hkW+Gp84
>>717
わけて考えろ。
1. hoge aaa;
2. new hoge();

1行目でhogeのインスタンスを格納(厳密にいうと参照)するためのaaaって変数を宣言してる。
2行目でhogeのインスタンスを作ってる。
これらを1行で書くと、
hoge aaa = new hoge();
となって、意味的には、hogeのインスタンスを格納するaaaって変数を作って、
そこに新しいhogeのインスタンスを作って代入してる。
727デフォルトの名無しさん:2014/07/17(木) 22:46:16.93 ID:FPE851Be
newが必要なのは参照を返すからかなぁ…

c++だとfuga aaa;でインスタンスが作れるよね。
初期化時の引数指定する場合はfuga aaa(arg1, arg2...);
728デフォルトの名無しさん:2014/07/17(木) 23:39:14.55 ID:uiWC/AQm
>>726
仰ることは分かります。
=new hoge()って書いてるんだから、aaaはhoge型と型推論してもいいんじゃない?記述が助長じゃない?と感じたんですよ。
生ビールを頼んだらジョッキに入れてくるのが当然でしょ? 湯呑みに入れてくる奴いないよね、って感じです
729デフォルトの名無しさん:2014/07/17(木) 23:53:03.49 ID:l9SOFkYr
Cやったことあるなら宣言部分けると意味わからんからで納得しそうだな。

「宣言部分けて友達とかに噂されると恥ずかしいし・・・」
730デフォルトの名無しさん:2014/07/17(木) 23:56:30.56 ID:l9SOFkYr
ああ、ガチなのか実際の型と宣言時の型が同じとは限らんよ
731デフォルトの名無しさん:2014/07/17(木) 23:58:34.91 ID:bU4NL8pp
まあそれを言い出したら型推論の方が汎用性は高いんだけどな
732デフォルトの名無しさん:2014/07/18(金) 00:22:33.50 ID:97CjBc8L
>>728
冗長性を排した言語を使えばいいよ。
長年使ってるからかも知れないけど、この程度の冗長性が丁度よいんだよ。
糖衣構文増やしてるのもあまり好きじゃない。
733デフォルトの名無しさん:2014/07/18(金) 00:31:22.02 ID:Qdsh15su
Javaも十分糖衣構文増やしてると思うけどね
誕生以後の拡張はほとんど全部糖衣構文だろ
734デフォルトの名無しさん:2014/07/18(金) 01:10:39.75 ID:97CjBc8L
>>733
うん、だからそれが嫌だなーって思ってるということ。
IteratorとかAPI増える方が好み。
仕事だと合わせて使うけど。

// 個人の感想であり、生産性を保証するものではありません。
735デフォルトの名無しさん:2014/07/18(金) 01:51:28.34 ID:v/tAoeoG
>>727
でもc++だとどこにインスタンスができるかいちいち把握しないといかんからなあ‥そういや c# と同じく auto が最近追加されたね
736デフォルトの名無しさん:2014/07/18(金) 02:09:39.50 ID:g4xH9Z8R
>>720
わざわざこういう書き方をするメリットは?

ArrayListの例だと、ArrayListがほぼListの実装でしかないから、そういう書き方をしてもあまり問題ないだろうけど、
List<String> list = new LinkedList<>()ととしてしまうと、Stack系のメソッドが漏れなく使えなくなる。
737デフォルトの名無しさん:2014/07/18(金) 02:48:18.47 ID:Vxw6ROqH
>>736
LinkedListを使うけどListのメソッドしか使わないことを明示する
738デフォルトの名無しさん:2014/07/18(金) 03:01:22.73 ID:9lilrWED
protectedなメンバでListのメソッド以外の操作されたくないときとかあるんじゃね
739デフォルトの名無しさん:2014/07/18(金) 03:57:24.91 ID:97CjBc8L
>>736
後で挿入が多くなって遅くなった時、最初だけLinkedListに書き換えれるだけで済む。
つまり依存が少ない。
740デフォルトの名無しさん:2014/07/18(金) 07:08:36.94 ID:Qdsh15su
ならそもそも型について何も書かない型推論が一番依存が少ないことになるよね
フィールドや引数なら誰が触るかわからないからともかく、ローカル変数なら例えば「getとaddを持つ任意の型」と見なせる
741デフォルトの名無しさん:2014/07/18(金) 07:42:25.13 ID:NkZsmPC5
その手の型推論はどこでうっかりLinkedListに成り下がるかわかったもんじゃないので
依存が少ないとは言えないんじゃね?
742デフォルトの名無しさん:2014/07/18(金) 07:45:40.48 ID:97CjBc8L
>>740
それを言うならローカル変数なら目の届く範囲だから依存しても構わないだろ。
Javaの中での書き方の話ししているのであって、型推論とかスレチ。
743デフォルトの名無しさん:2014/07/18(金) 09:03:29.59 ID:xlBjlAy7
newしたら普通はfreeやdeleteが伴う訳だがgcが解決してくれる。
javaではクラスのインスタンスは全て参照だから必ずnewが利用される。
プリミティブな変数はその限りではないのでいちいちnewはしないが、javaの配列は配列オブジェクトなのでnewが必要。

みたいな?
744デフォルトの名無しさん:2014/07/18(金) 12:18:19.99 ID:ZU8CSXrI
トランプがようわからん
簡潔にどういう感じになってんだ?

http://sasuke.main.jp/toranpu.html
745デフォルトの名無しさん:2014/07/18(金) 12:26:02.11 ID:QuIJUfIo
それぞれのカードがどの場所にどういう順序で並んでいるかをデータ化するだけ
746デフォルトの名無しさん:2014/07/18(金) 12:37:37.83 ID:ZU8CSXrI
ああ、理解できた
ありがとうございました
なんか変に難しく考えてました
747デフォルトの名無しさん:2014/07/18(金) 13:23:40.77 ID:ZU8CSXrI
でもこれって同じ札が何度も出る可能性あるよな?
この場合どうしたらいいんだ?

一度出たものをどこかの配列に格納して
それを比べるってのは検討ついたがどう書けばいいんだ
そういうクラスってもうあるのか?
748デフォルトの名無しさん
>>747
すいません
並び替えの表記ミスで同じ数字が出てただけでした。
ほんとすいません