【初心者】Java質問・相談スレッド112【大歓迎】 at TECH
[2ch|▼Menu]
[前50を表示]
750:デフォルトの名無しさん
08/02/24 21:56:26
>>749
Chatroom#userlistに何も代入していない

751:デフォルトの名無しさん
08/02/24 22:02:11
>750
回答ありがとうございます。

userlist.add(clientAddr);

上記の文でアドレスが代入されるものと思っていたのですが、
この文の書き方では代入されていないということでしょうか?

752:デフォルトの名無しさん
08/02/24 22:03:12
それはローカル変数のuserlistであってChatroom#userlistではない

753:デフォルトの名無しさん
08/02/24 22:28:32
>752

ありがとうございます。入ってると思ってたものが
別のものだったのですね。

助かりました、ありがとうございました。

754:デフォルトの名無しさん
08/02/24 23:29:39
Class Parent {
 private int val;
 public getVal() { return val; }
 public setVal(int val) { this.val = val; }
 public Parent clone() {...}
}

みたいに、clone() を実装したクラスParentがあったとして、
これを継承した子クラス Child を作ります。
で、この Child でも clone() を実装したいのですが、
その Child#clone() はどうやって実装するのが普通ですか?

public Child clone() {
 Child c = new Child();
 c.setVal ( this.getVal() );
 ...
 return c;
}

と、親クラスの Parent#clone() の存在を完全に無視してもいいもんですか?
これだとどうもスマートじゃないような気がして、protected なコンストラクタを
親クラスに追加する、なんて方法も考えたんですけど、
典型的な手法があるのならばご教示ください。

755:デフォルトの名無しさん
08/02/24 23:35:47
>>754
class Parent implements Cloneable { 
 private int val; 
 public getVal() { return val; } 
 public setVal(int val) { this.val = val; } 
 public Parent clone() {
  try{
   return (Parent)super.clone();
  } catch(CloneNotSupportedException e){
   throw new RuntimeException(e);
  }
 }
}
class Child extends Parent {
 public Child clone() {
  return (Child)super.clone();
 }
}

756:デフォルトの名無しさん
08/02/24 23:40:36
Javaの勉強始めました。

アクセス就職子protectedについて理解が足りないので教えてください。
protectedつけることで、
『自分のクラス内のメソッド 又は 継承されたサブクラス内のメソッドからしかアクセスできない』
そのように直感的に感じたのですが、
間違っているようで。
public class Purotekuto {
public static void main(String[] args) {
Test21 hogehoge = new Test21();
System.out.println( "値を出力:" + hogehoge.protectedInteger );
}}
public class Test21 {
protected int protectedInteger;
Test21() {
this.protectedInteger = 0;
}
public void setValue( int value ) {
this.protectedInteger = value;
}
public int getValue( int value ) {
return this.protectedInteger;
}}
このコードでは、main()から、クラスTest21のメンバ、protectedIntegerにアクセスできずに、
エラーか何かになると思ったのですが、普通に動きました。
自分の考えの何がまずいのでしょうか。。。

757:デフォルトの名無しさん
08/02/24 23:45:28
>754
super.clone() を使うかどうかは状況次第じゃね?
というか、普通はsuper.clone()は使えない方が多いと思う。
帰ってくるのはParentクラスのインスタンスだから、結局は値をコピーしなければならなくなるから。

758:デフォルトの名無しさん
08/02/24 23:46:09
>>754
何のための継承、何のためのオーバーライド。
何がスマートじゃないんだ。感覚的に言われてもな。

ちなみに、cloneを使うなら、Cloneable を implements すること。
// 詳しくは Clonable, Object.clone 参照。

>>756
同じパッケージからもアクセスできるから。以上。

759:デフォルトの名無しさん
08/02/24 23:47:23
>756
もう1つ条件があって、「同一パッケージ内からのアクセス」もOK

760:756
08/02/25 00:01:54
758,759 ありがとうございます。

指摘を受けて調べました。
パッケージ化しないことには、ソースはばらばらのパッケージ的な扱いと、勝手に勘違いしていました。
デフォルトのパッケージ、という扱いになるのですね。
勉強になりました。

761:デフォルトの名無しさん
08/02/25 00:09:47
と言うかデフォルトパッケージの使用は避けてくれ。

762:デフォルトの名無しさん
08/02/25 00:11:27
>>757-758
ありがとうございます。
ちょっと理解できてきました。

763:756,760
08/02/25 00:18:14
>761
というと、必ず特定のパッケージに入れることを明示することが望ましいということでしょうか。
自分今回痛い目にあったので、761の指示に従って付いてまいりますが。

764:デフォルトの名無しさん
08/02/25 00:48:09
>>763
デフォルトパッケージ以外のパッケージに属するクラスから
一切呼び出しが出来ない。(JDK 1.4 以降)

プログラミングの一般論としても
何らかの名前空間に所属させるのは
良い習慣だと思う。

765:デフォルトの名無しさん
08/02/25 01:00:16
>>754
普通はコピーコンストラクタを作る
Cloneable は Java の失敗作とジョシュアっちが言ってました

766:デフォルトの名無しさん
08/02/25 04:11:37
これからjavaを学ぼうと考えています。
JAVAのSDK沢山種類があるようですが、
どれを使用すれば良いでしょうか?

767:デフォルトの名無しさん
08/02/25 04:28:17
>>766
多分新しいのを使っとけばいいんじゃないだろうか

768:デフォルトの名無しさん
08/02/25 04:54:25
使う方のソースはそれで良いけど宣言する方のソースはアノテーション必要でしょ。

769:デフォルトの名無しさん
08/02/25 04:55:33
↑誤爆


770:デフォルトの名無しさん
08/02/25 07:44:10
SE(スタンダードエディション)でおk

771:デフォルトの名無しさん
08/02/25 08:40:00
>>733
\→\\
それと、カレントドライブの変更まではcdで出来ないけど、
その辺は大丈夫かな?

772:デフォルトの名無しさん
08/02/25 09:14:34
Timestamp型の変数から"yyyy/MM/dd"といった形の文字列で
値を取り出すにはどうしたらよいでしょうか?

773:デフォルトの名無しさん
08/02/25 09:34:57
String s = new SimpleDateFormat("yyyy/MM/dd").format(timestamp);

774:デフォルトの名無しさん
08/02/25 09:37:02
>>772
SimpleDateFormat("yyyy/MM/dd")でformatすれば?

775:デフォルトの名無しさん
08/02/25 09:44:18
質問です。
シングルトンを多数作りたいんですが、
private static Singleton instance = new Singleton();
public Singleton getInstance(){return instance;}
private Singleton(){}
といったおきまりパターンを各クラスに書かないと行けませんが面倒です
AbstractSingletonを継承したらgetInstance()で各シングルトンのインスタンスが取れるようになる
みたいな事ができれば便利ですけど、staticフィールドなのでそれもママなりません。
なんか旨い方法はありませんか?

776:デフォルトの名無しさん
08/02/25 09:49:44
ド素人質問ですみません;;
テキストフィールドに入力された文字列を
ボタンが押されたときに変数com_defに入力する
プログラムを作りたいのですが、
下のようにやるとローカル変数 i は内部クラスからアクセスされます。final で宣言される必要があります。
とエラーが出ます。
対処法を教えてください。よろしくお願いします。
text[i] = new JTextField("",2);
button1[i] = new JButton("変更");
button1[i].addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {

int com_def = Integer.parseInt(text[i].getText());

System.out.println(""+com_def);
}
});

777:デフォルトの名無しさん
08/02/25 10:01:15
>>773, 774
ありがとうございます。
できました。

778:デフォルトの名無しさん
08/02/25 10:11:39
>>775
eclipse ならテンプレートを使って、少し楽が出来る。下のほうに例がある。
URLリンク(www.eclipsewiki.net)

>>776
メソッドとその内部クラスとで共用で使う変数は、メソッド内 final として、コンパイルを通す。
他にも方法はあると思うけど、それ以上なら、クラス内クラスにしてちゃんと定義しましょ。

779:デフォルトの名無しさん
08/02/25 16:41:22
String s = "ab" + \r + "cd" + \n + "ef";
正しく直してください。

780:デフォルトの名無しさん
08/02/25 16:43:38
String s = "ab\rcd\nef";
直しました。

781:デフォルトの名無しさん
08/02/25 16:43:54
String s = "ab\rcd\nef";

782:781
08/02/25 16:44:30
かぶった...orz

783:デフォルトの名無しさん
08/02/25 16:46:12
780,781 ありがとうございます。

784:デフォルトの名無しさん
08/02/25 16:47:23
qa3808666 かぶってる...

785:デフォルトの名無しさん
08/02/25 17:24:32
それはかぶってるんじゃなくてマルチポストだろう…

786:デフォルトの名無しさん
08/02/25 17:47:04
tomcatのjsp-examplesにあるFORM認証のサンプルについて質問です。
まず操作を1->5の順で行った結果を書きます。

1.URLリンク(hostname:port)にアクセスするとFORM認証機能が働きlogin.jspが表示される。
2.login.jsp -> Username/Passwordを間違えて入力->error.jspが表示される。
3.error.jsp -> "try again"をクリック -> login.jspが表示される。
4.login.jsp -> Username/Passwordを正しく入力 -> login.jspが再表示される。
5.login.jsp -> Username/Passwordを正しく入力 -> HTTPステータス 404 - /jsp-examples/security/protected/j_security_check

4でUsername/Passwordを正しく入力しているので1のindex.jspに飛ぶことを期待したのですが、login.jspが再表示されました。
login.jspの出力内容がブラウザに表示された時に、ソースを表示してみると
□2のlogin.jsp
<form method="POST" action='j_security_check;jsessionid=74394043647C95BAC48CC67ECDFFEFB7' >
□4のlogin.jsp
<form method="POST" action='j_security_check' >
比較してみると、4のソースではセッションIDが付加されていない為に、本来の遷移先のURLを見失ってしまっている、ということでしょうか?

jspソースファイルを見ると、login.jspもerror.jspもresponse.encodeURL()の結果をセットしていました。
login.jspのリクエスト箇所
<form method="POST" action='<%= response.encodeURL("j_security_check") %>' >
error.jspからlogin.jspを表示するリンク箇所
<a href='<%= response.encodeURL("login.jsp") %>'>again</a>.

今のままだとerror.jspからブラウザの戻るボタンで前画面(login.jsp)に戻らないと、認証後に期待したURLへ遷移してくれません。
error.jspにあるアンカータグでlogin.jspに戻った時も同じ動きにさせたいのですが、どのように修正すれば対応できるでしょうか?

787:786
08/02/25 17:51:39
携帯のブラウザでも見るので「JavaScriptは使わない」という前提でお願いします。

788:デフォルトの名無しさん
08/02/25 18:37:01
自作のある圧縮アーカイブの解凍ストリームを作ろうと思っています。
その圧縮形式はライブラリを持っており、InflaterInputStreamを利用すると比較的に楽に実現できると考えたのですが、
read()やread(byte[],int,int)など、いずれにせよユーザーが決めるバッファのサイズで解凍を行う必要があるため、今回のような解凍する側で単一バイト読み込み時に出力されるデータを決めるライブラリを持った圧縮形式ではどのように行うべきなのか分かりません。
解凍したデータもバッファリングして、ユーザーのサイズに合わせて出力すれば実現はできると思うのですが、何か他にいい方法はないものかと思い質問しました。
Inflaterのソースも読んでみたのですが、肝心の部分はnativeメソッドになっており結局どのような実装なのか分かりませんでした。良い方法がございましたら教えてください。

789:デフォルトの名無しさん
08/02/25 19:24:42
>>788
>解凍したデータもバッファリングして、ユーザーのサイズに合わせて出力すれば実現はできると思うのですが

それしかないのでは・・・
1バイトだけ返すread()を実装すればあとはデフォルトの実装があるので、
class MyInputStream extends InputStream {
 private byte[] buf;
 private int pos, size;
 public int read() throws IOException {
  if (pos == size) {
   // 解凍データをbufに詰めてsizeをセット
   pos = 0;
  }
  return buf[pos++];
 }
}
これだけでも一応動くよ
InflaterInputStreamをどう利用しようとしてるのかよくわからんが、あれはzlibストリーム専用

790:789
08/02/25 19:27:03
×return buf[pos++];
○return buf[pos++] & 255;
でした・・・

791:デフォルトの名無しさん
08/02/25 20:59:08
>>775

邪道かもしれんが。 なんか旨い方法、ということなら。

Enum の中に書く定数は1つ1つがシングルトンだ。
全定数に共通のメソッドも振る舞いが異なるメソッドも実装できるぞ。


792:ちんこ ◆GbXlaaQNk.
08/02/25 21:04:53
Javaにはプリミティブと参照が混在しています。
Listなどを使う時には参照型しか使えないのですが、
いっそすべてのintをIntegerに書き換えた方がいいでしょうか?
プリミティブ型の扱いをみなさんどうしていますか?
おれはRubyからJavaに来たので数字が参照型じゃないというのに
すごく違和感を感じます。ましてや混在しているというのは非常事態です。

今すごく悩んでいます。
みなさんがどうしているかを知りたいです。

793:デフォルトの名無しさん
08/02/25 21:09:13
>>789
ネットに繋がらなくて返事が遅くなってしまいました。
聞いていた立場で申し訳ないです。
Inflaterを利用しようと思ったのは、形式に共通点が多く、いくつかをオーバーライドすればできそうな気がしたためです。
確かに本来の用途から外れますので使用すべきではありませんね。

やはりバッファかますことにします。
親切にどうもありがとうございました。

794:デフォルトの名無しさん
08/02/25 21:10:35
>>792
せっかくプリミティブ型があるのにわざわざオブジェクトにする必要はないと思います。
コストの問題ももちろんですが、何より扱いにくいです。

795:デフォルトの名無しさん
08/02/25 21:18:04
>>792

Integer って、オブジェクトだとは言っても、中のデータを書き換えられないから不便だよ。
List などには int を入れても auto boxing されるんだから、int のままでいいんじゃないかなあ。

みなさんがどうしているか、に関しては、「気にしていない」だと思う。


796:デフォルトの名無しさん
08/02/25 21:18:13
>>792
そういう言語だから受け入れるしかない
Rubyは理想を重視した分遅くなってるし
C#はプリミティブ型の扱いを変えて両立させてるけどその分複雑になってたりする

797:デフォルトの名無しさん
08/02/25 21:42:46
Strint[] a = {"A","B"};
aの要素数を1にするtruncateみたいなものはありませんか?


798:デフォルトの名無しさん
08/02/25 21:54:32
配列じゃなくてリストじゃ駄目なん?

799:デフォルトの名無しさん
08/02/25 22:01:35
>>798
Strint[] a; という配列でやりたいです。
Strint[] a = {"A","B"};
ここで処理して"A"が不要だと分かって、
a = {"B"};
とすればよいのでしょうか?
以前のaはa = {"B"};する直前にガベコされるのでしょうか?
それとも内部でtruncateみたいなことされて、aのアドレスは変わらないのでしょうか?

800:ちんこ ◆GbXlaaQNk.
08/02/25 22:04:44
>>795
配列のautoBoxingがないです。
例えば

void methodA(int a)
にInteger型を放り込んだらこれはBoxingされますが、

void methodB(int[] a)
にInteger[]型を放り込むのはエラーになります。

配列からListを作る時にも参照型が強制されるので不利かと思いました。
(例えばArrayList<int>はエラーになる)

>>796
JRubyもダメでしょうか?(速度に関して)

801:デフォルトの名無しさん
08/02/25 22:05:33
>>799
a = {"B"};
でよい。{"A","B"}はGCまかせ。
ちなみにGCは、不要になったら即実行される訳じゃないよ。

802:デフォルトの名無しさん
08/02/25 22:09:09
>>801
ありがとうございます。ガベコに任せます。

803:デフォルトの名無しさん
08/02/25 22:09:22
>>801
それ、初期代入でしかできないんじゃね?

804:デフォルトの名無しさん
08/02/25 22:12:12
>>803
そうでした。
Strint[] a; という配列でやりたいです。
Strint[] a = {"A","B"};
ここで処理して"A"が不要だと分かって、
Strint[] aTemp = {"B"};
のように、もう1つ変数が必要ですか?

805:デフォルトの名無しさん
08/02/25 22:16:45
aTempの要素数はどうするの?
ArrayListを作って必要な要素だけ追加していって後で配列に変換したほうが早い
配列でやるにしてもどうせ同じようなことを自分でやることになる

806:デフォルトの名無しさん
08/02/25 22:17:13
String[] a = {"A", "B"};
a = new String[1];
a[0] = "B";
でよくね?

807:798, 803, 806
08/02/25 22:18:52
>>805
んだなぁ。
ArrayList<String> a = new ArrayList<String>();
a.add("A"); a.add("B");
a.remove(0);
とかでいいと思った。

808:デフォルトの名無しさん
08/02/25 22:25:09
>>806
そうできるんですね。ありがとうございます。
>>807
STLってまだよく分からないんです。でもありがとうございました。

809:デフォルトの名無しさん
08/02/25 22:27:18
STLw
それはおいといて,>>806でいいんだったら
String[] a = { "B" };
と全く変わらないよ

810:798, 803, 806
08/02/25 22:28:13
STLはC++のライブラリのことじゃねーの?w
ちなみに配列への変換は
String[] array = a.toArray(new String[a.size()]);
でいいと思う

811:デフォルトの名無しさん
08/02/25 22:51:19
>>807
配列モドキとコレクション
List<String> list = Arrays.asList("A", "B");
System.out.println(list);
list = ArrayList<String>(list); // 編集可能化
list.remove(0);
System.out.println(list);

812:デフォルトの名無しさん
08/02/25 22:57:41
>>808
おまいは勘違いしてる。Javaの配列はサイズを変更(Cで言うところのrealloc)出来ない。
配列限定で長さを変えるには、新しい別の配列を作ってコピーするしかない。
今まで挙がってた例は全て新しい別の配列を作っているだけ。
長さが変わる場合、通常はArrayList等のList系のコレクションを使い、
どうしても配列が必要な場面でだけtoArray()で変換する。

813:デフォルトの名無しさん
08/02/25 23:07:52
>>800

配列は既にオブジェクト(変数には参照が収められる)だから、auto Boxing はいらないし、
List にも add できる。
int[] を要求している所に Integer[] を放り込むとエラーになるのは型が違うから。
放り込めることを期待するのは
int に対応するのが Integer、int[] に対応するのが Integer[] という感覚があるからだろうが、
この4つの中で、int だけがプリミティブ、Integer だけが値変更が不便なので、
Integer は int をオブジェクトにするためだけにある特別な存在で、
対称性はあまり無い、と考えた方がいい。


814:デフォルトの名無しさん
08/02/25 23:30:24
>812
変更不可なgetterで結構toArray使わんか?

815:デフォルトの名無しさん
08/02/25 23:32:42
一件教えてください。

main()の中で記述していた処理を、
ほかのファイルの関数に移動したいのですが、どのようにすればよいかわからず、教えてほしいです。
(サブルーチンで処理をするような考え方で。)

c言語で言えば、
main(){
  一連の処理のまとまり1
  一連の処理のまとまり2

となっていたものを
main(){
  func1(渡す必要のある変数)
  一連の処理のまとまり2
}
func1(引数){
  一連の処理のまとまり1の代替
  必要があればreturn文
}
といった感じ(型とか細かいことは別として。)に分割したいのですが。

今の自分の知識では、クラスを作って、メソッドを作って、
メソッドをインスタンス化して、
仮にインスタンスが設定された変数の名前がaaaとしたら、
aaa.メソッド(引数) とするくらいしか、頭が回りません。
メソッドを利用したいだけで、インスタンス化が必要なのか疑問で、やりかたがあるような気がしまして。

よろしくお願いします。

816:デフォルトの名無しさん
08/02/25 23:39:52
>>815
別クラスにする必要がないのなら、別クラスにしなくていいんじゃない?
mainのほかにクラスメソッド書けばよい。

他からも使いたいけど、インスタンスを作る意味がないのなら、ユーティリティクラスという手もある。
java.lang.Mathみたいなクラス。メソッドは全て、クラスメソッドとして定義する。


817:デフォルトの名無しさん
08/02/25 23:45:00
>>815
>メソッドを利用したいだけで、インスタンス化が必要なのか
オブジェクト指向の世界では必要だという前提なんだよ
原則としてすべてのメソッドはどっかのクラスに属していて、インスタンスを介して使用する事が基本
逆に言えばクラスに属するけど、インスタンスを介さないmainメソッドの方が特殊

慣れるまで、メリットを感じるまでは解らんと思うが、最初はそういう世界と思うしかない

818:デフォルトの名無しさん
08/02/25 23:47:04
>>815

メソッドはいくら分割してもメソッドだ。
その例だとオブジェクトになるのは (渡す必要のある変数) ってやつだけだな。

main() で
渡す必要のある変数の型 obj = new 渡す必要のある変数の型();
して、
obj.func1()


819:デフォルトの名無しさん
08/02/25 23:47:46
>>809
Strint[] a = {"A","B"};
ここで処理して"A"が不要だと分かって、
Strint[] a = {"B"};

↑aが2重定義になるので>>806の方法にしました。


820:デフォルトの名無しさん
08/02/25 23:49:18
>>815
// メインクラス(Main.java)
public class Main {
  public static void main(String[] args){
    Sample.func();
  }
}

// サブルーチンクラス(Sample.java)
public class Sample {
  public static void func(){
    // ↑staticでメソッドを宣言すれば<クラス名>.<メソッド名>でアクセスできる。
    System.out.println("Hello, world!");
  }
}

821:815
08/02/25 23:49:35
815です。
レスありがとうございます、816,817。

>クラスメソッド(816)
クラスメソッドの概念を知りませんでした。ありがとうございます。

>オブジェクト指向の世界では必要だという前提なんだよ(817)
その考えを理解できるように努力していきます。
指摘ありがとうございます。

822:815
08/02/25 23:51:52
>820
レスポンス記述している最中に更新されたようで、失礼しました。

816のおっしゃる、クラスメソッドの具体例ですね。
わかりやすい説明ありがとうございます。

823:デフォルトの名無しさん
08/02/25 23:51:53
>>815

>ほかのファイルの関数に移動したい
>サブルーチンで処理をするような考え方で
>メソッドを利用したいだけで

インスタンス化したくないなら当然インスタンス化は不要だ。


824:デフォルトの名無しさん
08/02/25 23:58:44
>>815
他の方が指摘してらっしゃるように、
メソッドは、必ずしもオブジェクトに関連付ける必要はありません。

蛇足。Javaでは「他のファイルに記述する」という概念はありません。
あくまでも、クラスを分けるかどうか、です。
それゆえか、クラス内クラスである内部クラスが4種類あります。

825:ちんこ ◆GbXlaaQNk.
08/02/26 00:30:07
JRubyやってみようと思う。

826:815
08/02/26 00:32:49
815です。

821内の『>818』は『>820』の間違いですね。失礼しました。

>818
今コーディングして確認しました。
クラスメソッドを直接呼び出すか、
通常に、通常のメソッドをインスタンス化して呼び出すかですね。

>823
>インスタンス化したくないなら当然インスタンス化は不要だ。
いま確認とりたいと思いコーディングしてみたのですが、
ほかの方が示された用にstaticにするほかに方法あるのでしょうか。
staticなメソッドにするか、インスタンス化するか以外で試せませんでした。
staticにすることをおっしゃっているのでしょうか。(私の821,822のように時間差?)

>824
内部クラス。理解できるよう精進します。Tipありがとうございます。

自分の質問に対して、
816の考え方、817の考え方、の二種類の意見を持つ方に分かれるように感じました。
オブジェクト化するべきとの考えと、ユーティリティメソッドでいいのではという考えと、です。
このどちらを選ぶかは、個人やGrの考え方次第ということなのでしょうか?
それとも、オブジェクト指向的には後者の方が、望ましいが、面倒な手続きは好まれないので、前者が使われるということなのでしょうか。

827:デフォルトの名無しさん
08/02/26 00:42:12
>>826
おおざっぱには、
・データが主体ならオブジェクトにする。
・ロジックが主体ならクラスメソッドにする。
くらいで良いのではないかと思ってる。(無論例外は山ほどある)

828:デフォルトの名無しさん
08/02/26 00:50:08
こんばんわ。
eclipse使いはじめたのですが、eclipseに指摘されるエラーの意味がわからないので教えてください。

たとえば、まさに820のコードを、
eclipseでひとつのファイルに記述すると、
クラスSampleを別のファイルに書けといわれます。

Javaのルールなのでしょうか。
どういった原因なのか教えてください。
eclipse特有で指摘されるものなのでしょうか?

829:デフォルトの名無しさん
08/02/26 00:51:19
>>826
何を作っているのかによる。
なんらかの概念(伝票・取引みたいな業務概念や、ファイル・ウィンドウのようなシステム概念)の、
特定のひとつに対する操作であれば、インスタンスメソッドとすることが望ましい。

逆に、概念に属する全ての対象に対する操作や、そもそもその対象を作り出す操作などはクラスメソッドになる。

ただし、実際にはクラスという概念とは関連づかない操作もあり、
Javaの場合は全てのメソッドがクラスに定義されなければならないため、便宜的にクラスメソッドとする。

830:デフォルトの名無しさん
08/02/26 00:52:53
>>828
Javaのルール。

publicのクラスはファイル名=クラス名としなければならない。
なので、自動的にひとつのファイルにはpublicクラスは一つまでしか定義できない。

831:デフォルトの名無しさん
08/02/26 00:58:39
>>828
830 の通り、Javaの仕様です。
public を外すか、クラス内クラスにするか、
一応、一つのファイルに複数のクラスを記述する方法はあります。

832:デフォルトの名無しさん
08/02/26 01:03:07
828です。
830氏、831氏、すばやい回答ありがとうございます。
勉強になりました。
publicがキーワードでしたか。

833:デフォルトの名無しさん
08/02/26 01:21:48
アクセス修飾子について説明もらえませんか。

アクセス修飾子には、public, protected, privateがあり、
アクセス制御の範囲としては、上記3つのほかに、修飾なしを含めた4つがあるようです。
で、最後の修飾なしなのですが、
実際に仕事でのプログラミングや、アプリケーションの作成で、使用されるのでしょうか。
範囲が修飾ありの3つと異なるのですが、何も記述しないというのが、どうにも好きになれないみたいな。
基本的に、何らかの修飾をしましょうということは無いですか?

834:デフォルトの名無しさん
08/02/26 01:31:30
>>833
たしかに気持ち悪いが、そう決まってる以上、そういうもんだと思うしかない。
使う場面はときどきあるよ。
トップレベルクラスは、publicにしたくなければ、他に選択肢もないし・・・

835:デフォルトの名無しさん
08/02/26 01:40:22
>>833
クラスは良くパッケージデフォルトにするなぁ。
パッケージをコンポーネントと見立てて、publicがインタフェースでパッケージデフォルトが実装の詳細。

メソッドやフィールドではあまり使ったことないや。

836:デフォルトの名無しさん
08/02/26 01:55:23
はじめて手に入れたIDEがeclipseで今までCとWinSDKをエディタで何とかしようと苦労してたのが嘘みたいに
GUIなアプリケーションがさくさく書けてJavaマンセーな状態なのですが、
そろそろ他の言語ってかC++で同等の事ができるようになりたいと思い始めてます。

そんなぼくにお勧めのC++用のIDEを教えてくれませんか?
eclipseみたいにCtrl+spaceなどでガンガン補完できるようなやつで、
リファクタリングが強力なやつがよいです。

(若干スレ違い?)

837:デフォルトの名無しさん
08/02/26 02:09:29
>>836
全くスレ違い
CDT

838:デフォルトの名無しさん
08/02/26 02:46:20
>>833
派生先からだけ見えて欲しい時は多数あるけど
パッケージ内からだけ見えて欲しい時がないので
デフォルトスコープを使う機会がない。

継承・実装の階層とパッケージ階層とは全く別個のものなのに
1系統の修飾子で片付けようとしたのに無理がある。
パッケージ階層は無視するか2系統用意して組み合わせ可能にしたら良かったのに。

C#(.NET?) だと名前空間は無視するかわりに、
アセンブリ境界に対して internal で制限するかどうかを選べる。

839:デフォルトの名無しさん
08/02/26 03:20:53
>>833
そこそこ可視性があるが、言語的に最後の砦であるパッケージの境界でカプセル化してセーフ
というのがパッケージプライベートなので、とりあえず書いてみる的に使うのは、ちょうどよいのかと。

そして、とりあえず書いてみるレベルだったら、
何も修飾子を書かなくてもええじゃないか、のような乗りかと。

なお継承はカプセル化を壊すので、protected を使うのはその一線を越えます。

840:833
08/02/26 03:45:25
833です。
返信にただいた内容を元に、学習します。

>839
>なお継承はカプセル化を壊すので、protected を使うのはその一線を越えます。
この点について、初心者向けの説明をいただけませんか。
時間かけると理解が進む資料の場所もみつかるのでしょうが。

841:デフォルトの名無しさん
08/02/26 07:01:30
>>819
a = new String[]{"B"};

842:デフォルトの名無しさん
08/02/26 08:12:42
>言語的に最後の砦であるパッケージの境界でカプセル化
JDK7になったらスーパーパッケージが出来るんだけどねぇ。
JDK7は本当に完成するんだろうか。

843:デフォルトの名無しさん
08/02/26 10:47:38
>>841
ありがとうございます。それにしました。

844:デフォルトの名無しさん
08/02/26 17:19:58
出力を行うときに何でoutputstreamwriterを使わなければいけないのですか?
テキストでこの章に入るまではこれを使わなくても出力できていたわけ
ですから。


845:デフォルトの名無しさん
08/02/26 17:22:42
好きなものを使えばいいんじゃない?

846:デフォルトの名無しさん
08/02/26 17:25:51
ストリームの意味が分からん

847:デフォルトの名無しさん
08/02/26 18:24:48
>>846
ベルトコンベアみたいなものを思い浮かべろ
そこに物(データ)を置くと、それはどこかに流れていく
それが出力ストリームのイメージ (streamは流れという意味)
どこに流れていくかは、それがどんなストリームかによる
例えば FileOutputStream だったら、ファイルに書き込まれる
System.out だったら、標準出力に行く
ソケットだったらネットワーク上に送信されていく
出力先が何であるにせよ、そこにデータを書き込むというのは同じ
そういった、何かしらのデータの書き込み口というものを抽象化したのが、出力ストリーム

>>844
別にOutputStreamWriterを使わなければならないことはない
出力を行う方法は他にもいくつかあるが、
そのテキストでは単にそのうちのひとつを紹介してるだけだろう

848:デフォルトの名無しさん
08/02/26 18:42:43
>>847分かりやすいな説明ありがと!!!

849:デフォルトの名無しさん
08/02/26 18:51:52
一通りテキスト終わったら、トレーニング用のテキスト売ってるんだけど
それ買ってやったほうがいいかな?
てか、なんかJAVAの勉強しても何か実感わかないな〜
やっぱ実際にもの作らんとそういうのは分からないものなのか?

850:デフォルトの名無しさん
08/02/26 18:59:39
>>849
どんなテキストか知らないけど
ウィンドウ開いたりボタン押したり絵を出したりといったGUIをやると
実感をわかせるのに効果的だと思う

851:デフォルトの名無しさん
08/02/26 19:07:46
ほうほう

852:デフォルトの名無しさん
08/02/26 19:13:33
>>849
何か自分で作ってみたいものはないの?
目標を決めるといいかもよ

853:デフォルトの名無しさん
08/02/26 20:41:10
今高校3年生だから、専門学校へ行ったときの予習をしてるんだ。
javaでどんなの作れる?とりあえず簡単なものを作ってみたい。

854:デフォルトの名無しさん
08/02/26 20:42:27
どんなものでも

855:デフォルトの名無しさん
08/02/26 20:44:02
そんなことよりもう一年勉強した方が

856:ibj
08/02/26 20:55:19
以下のソースコードで
alice1 == alice2:true
alice1 == alice3:false
Chapter5.Employee[name = null, salary = 75000.0, hireDay = Tue Dec 15 00:00:00 JST 1987]
Exception in thread "main" java.lang.NullPointerException
at Chapter5.Employee.equals(Employee.java:48)
at Chapter5.EqualsTest.main(EqualsTest.java:17)
と ぬるぽが出てしまいます。
2時間ほど考えたのですが原因がわかりません・・・。super(name)の部分で
どうにかなっていると思うのですがロジック的に正しいと思うのですが・・・。
教えていただけたら幸いです。

857:ibj
08/02/26 20:56:07
package Chapter5;

public class EqualsTest {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Employee alice1 = new Employee("Alice Adams", 75000, 1987, 12, 15);
Employee alice2 = alice1;
Employee alice3 = new Employee("Alice Adams", 75000, 1987, 12, 15);
Employee bob = new Employee("Bob Brandson", 50000, 1989, 10, 1);

System.out.println("alice1 == alice2:" + (alice1 == alice2));
System.out.println("alice1 == alice3:" + (alice1 == alice3));
System.out.println("alice1.equals(alice3):" + alice1.equals(alice3));
System.out.println("alice1.equals(bob):" + alice1.equals(bob));

Manager carl = new Manager("Carl Cracker", 80000, 1987, 12, 25);
Manager boss = new Manager("Carl Cracker", 80000, 1987, 12, 25);
boss.setBonus(5000);
System.out.println("boss.toString():" + boss.toString());
System.out.println("carl.equals(boss):" + carl.equals(boss));
}

}

858:ibj
08/02/26 20:56:36
package Chapter5;

abstract class Person{
private String name;

public Person(String name){
this.name = name;
}

public abstract String getDescription();

public String getName(){
return this.name;
}
}


859:デフォルトの名無しさん
08/02/26 20:56:49
専門なんて行っても勉強してる暇ないぞ。
情報系の大学いった方がまし

860:ibj
08/02/26 21:00:13
あう・・改行多すぎて書き込めない

861:デフォルトの名無しさん
08/02/26 21:44:23
>>856
Employee にも何故か name があって、equals で、
other.name.equals(name)で比較してるんじゃないかと。

862:デフォルトの名無しさん
08/02/27 00:58:27
力添えください。

URLリンク(www.nextindex.net)
に記述のあるソースの中で、
main()がthrows InterruptExceptionとしてある理由がわからないのですが、
どういう意味なのでしょうか。
教えてください。
今回実行してみた感じ、定義をしなくとも実行には問題がありませんでした。
どの部分が、InterruptExceptionを投げるといっているのでしょうか?
少なくともtry-catchの外しか考えられないのですが、どこかわかりませんでした。



863:デフォルトの名無しさん
08/02/27 01:06:39
そのページの赤文字で書かれてるThread.sleep(1000);の所が投げてる。
javadocに書いてあるから読むと良いよ。

864:デフォルトの名無しさん
08/02/27 01:16:59
文字列のサイズの取得で、
String s="あ";
2を取得する方法を教えてください。

865:デフォルトの名無しさん
08/02/27 01:18:11
s.getBytes().length

866:デフォルトの名無しさん
08/02/27 01:28:19
3になりました

867:デフォルトの名無しさん
08/02/27 01:36:09
862です。
レスありがとうございます、853。
自分もThread.sleep(...);
がInterruptedExceptionを投げる可能性があることはなんとなく覚えたのですが、
今回の場合は、try{}catch(InterruptedEception e){}、の記述によって、
メソッドがthrowsを設定する必要は内容に感じたのです。
うーん…。

868:デフォルトの名無しさん
08/02/27 01:37:35
s.length() + 1

869:デフォルトの名無しさん
08/02/27 02:06:26
"qa3813364".length();

870:デフォルトの名無しさん
08/02/27 02:17:57
>>865
GJ!

871:デフォルトの名無しさん
08/02/27 02:40:21
>>840
>>なお継承はカプセル化を壊すので、protected を使うのはその一線を越えます。
>この点について、初心者向けの説明をいただけませんか。

なんてことはない、メソッドをオーバライドすると、親クラスがそのメソッドを呼び出している場合
その挙動にも影響を与えるため、どのような影響があるか(どのように呼び出されているか)を
知る必要があるという意味で、実装が漏れてるという見方ができる。

継承よりも委譲の方が強固だが、継承のほうがお手軽なので
最初は継承を使って、事が複雑になってきたら、委譲にリファクタリングするのがアジャイル的

872:デフォルトの名無しさん
08/02/27 02:44:06
委譲めんどくせえ

873:デフォルトの名無しさん
08/02/27 02:59:17
>>867
InterruptedException を飲み込んでいいのは、
実行中のタスクのキャンセレーションポリシーと
実行しているスレッドのインタラクションポリシーが明記してあり
(あるいはそのスレッドのライフサイクルの制御権があり)、
ちょうど両者とも、InterruptedException を飲み込んでOKな場合だけ。

インタラプトを遅延させて処理を継続したい場合は
Thread.currentThread().interupt()を
処理が継続できない・放棄する場合は
InterruptedException を再投げするのが定石


874:デフォルトの名無しさん
08/02/27 03:00:53
>>867
そうだね必要ないな
たぶんどこかからコピペしてきた消し忘れかなんかだろう
ちなみに、InterruptedExceptionを揉み消すのは良くない習慣だ

875:873
08/02/27 03:13:13
間違った。
2つのポリシーが上手い具合にOKなときにやっていいのは、インタラプトの発行だった。

タスクが InterruptedExceptionを飲み込んでいいのは、
そのタスクが IntteruptedException を飲み込んでOKなポリシーを持つスレッドからしか
呼び出されないことが保証されている場合だけだな、たぶん

main() は、どこからともなくやって来たスレッドで実行されるから、
基本的に飲み込んではいけないはず

876:873
08/02/27 03:50:52
間違った。
「インタラプトすると不正な挙動をします」というポリシーを明記したタスクとして
InterruptExceptionを飲み込むならば、単に、

「インタラプトしてはいけないタスク」
+「インタラプトするとエラーメッセージを吐いて終了するっぽいメインスレッド」
=「このスレッド/タスクにインタラプトしてはいけない」

となるだけだった。さあ、どんどん飲み込みましょうねぇ


877:デフォルトの名無しさん
08/02/27 05:38:33
>>864
s.getBytes("Windows-31J").length
など。

URLリンク(sdc.sun.co.jp)(java.lang.String)

878:デフォルトの名無しさん
08/02/27 08:04:00
Beanのbooleanプロパティのgetter/setterメソッドの命名について質問です。
たとえばbeautifulというプロパティとしたら規則に従いますと
単純にisBeautiful(),setBeautiful(boolean)となります。
しかし、別の例で「上書き確認を表示する」など動詞的なbooleanプロパティ、confirmOverwriteを考える場合
isConfirmOverwrite(),setConfirmOverwrite(boolean)と、とても気持ちが悪いです。
このような場合は変数名を考え直す必要があるのでしょうか?
それともこういうもの、ということで割り切ったほうがいいのでしょうか?

879:デフォルトの名無しさん
08/02/27 09:13:57
最近はokwaveとか教えてgooとかと
マルチするのが流行りなのか

880:デフォルトの名無しさん
08/02/27 09:19:46
-ableをつける

isConfirmOverwritable()
setConfirmOverwritable(boolean)

881:デフォルトの名無しさん
08/02/27 09:23:42
その場合 confirm に able を付けるべきだと思うんだ

882:デフォルトの名無しさん
08/02/27 09:52:15
なるほどー!かなりすっきりしました。
ありがとうございます!!

883:デフォルトの名無しさん
08/02/27 11:17:58
JasperReportsで帳票毎に四角形の色を毎回変えたいんだけど
どうしたらいいですか?

iReoprtで
rectangle、backcolorを変更するというのはわかるんですが、
毎回違うとどうしたらいいのでしょうか?



884:デフォルトの名無しさん
08/02/27 12:00:12
毎回ってのが意味解らん。
毎ページなのか、毎項なのか、毎行なのか、毎カラムなのか。

まずは日本語でおk

885:デフォルトの名無しさん
08/02/27 12:20:01
そもそもJava以前に、自分が抱えている問題を把握できていないケースが多い気がする。
だから日本語がおかしいし、説明されても理解できない。


886:デフォルトの名無しさん
08/02/27 12:41:34
右シフトでどっちが高速なのか試してください。
>> >>>

887:883
08/02/27 13:01:04
枚ページです。

コンパイルしちゃった後でも変更できるんですか?


888:デフォルトの名無しさん
08/02/27 13:26:21
sunはInterruptedExceptionは握り潰すな再スローしろってスタンスだっけ?

889:デフォルトの名無しさん
08/02/27 14:26:24
>>888
このへんが参考になるかも
URLリンク(www.ibm.com)

890:デフォルトの名無しさん
08/02/27 19:00:22
java sound を使うとパソコンから盗聴が可能ですか

891:デフォルトの名無しさん
08/02/27 19:06:52
こっちでやれ
スレリンク(tech板)l50

892:デフォルトの名無しさん
08/02/27 21:56:31
Java の理論と実践: アトミックで行く
URLリンク(www.ibm.com)

このページにある、リスト3: SimulatedCAS クラスの compareAndSwap について質問です。
SimulatedCAS のコードのすぐ下にある説明書きに、
「CASベースの並行アルゴリズムは、スレッドがロックを待つ必要が全くないので、lock-freeと呼ばれます」
という記述があります。

しかし SimulatedCAS の compareAndSwap メソッドは synchronized メソッドに
なっています。Simulated って書いてあるから実際使うときは違うやつ使うのか
なと思いきや、 リスト4 のコードで思いっきり使ってあります。

compare-and-swap アルゴリズムを真似たプログラムは、 synchronized であっても
ロックされないように最適化されるということでしょうか?

893:デフォルトの名無しさん
08/02/27 22:05:06
レンタルサーバー借りて
毎日一回株価を取得してDBに放り込むプログラムを作ろうと思ってるんだけど
JAVAで時間がきたらサーバー上で実行するってことかのう?
どんな仕組みでできる?


それだけわかればDBにも移せるしダウンロードもできそうなだんだが

894:デフォルトの名無しさん
08/02/27 22:17:24
普通 cron 使う。

895:デフォルトの名無しさん
08/02/27 23:33:28
実行先のJREバージョンに応じて違う処理をさせたいと考えています。
バージョンに応じて違うクラスファイルを読み込むようにするには
どうしたらよいでしょうか?

JARアーカイブとMANIFESTファイルを利用しており、クラスライブラリが
たくさんあるのでバージョンごとに違うJARを作成するのは避けたいのですが・・・

896:デフォルトの名無しさん
08/02/27 23:43:07
Class.forName(javaVersionName+ClassName).newInstance();

897:867
08/02/28 00:01:48
いくつかのレスポンスありがとうございます。
申し訳ないんですが、ぜんぜんわからないです。
1時間くらいgoogleしてみたのですが、
そこから派生するキーワードや、
似たような単語が、同様の意味を成しているのかもわかりませんでした。
せっかく手を差し伸べていただいたところ申し訳ありません。

飲み込む、もみ消す、握りつぶす、
非チェック例外、チェック例外、チェック済み例外、チェックされる例外…
飲み込むというのは、InterruptedExceptionを投げずに処理してしまうということなのでしょうか…

898:デフォルトの名無しさん
08/02/28 00:11:59
オブジェクト指向初心者です。
調べるの面倒です。教えてください。

このスレッドを読んでいて、初めて 委譲 を知ったのですが、
クラスの外部から、インスタンスのフィールドにアクセスできる仕様というのは、
オブジェクト指向的に、思い切り間違えなのでしょうか。
委譲 の概念が普通に使われるためには、
フィールドへのアクセスは、
クラスに所属するメソッド経由で、アクセスされる仕様である場合でないと、
アクセス方法に統一性がもたせられませんよね。

そもそも、このような質問をする原因が、
なぜフィールドの値をpublicにするなど、
所属クラス内のメソッド以外からの、フィールド変数(?)へのアクセスが許可される必要があるのか
が、わからないためです。

質問の仕方が、気に入らなければ、無視してください。
たぶん調べてもまともな回答にたどり着くに、長い時間がかかりそうだと思い、怠けています。

899:デフォルトの名無しさん
08/02/28 00:19:18
答えるの面倒です。教えません。

900:デフォルトの名無しさん
08/02/28 00:21:29
>>895
interface AnythingExecutor{
 public void doAnything();
}

public class AnythingExecutor14 implements AnythingExecutor{
 public void doAnything(){
  // JRE 1.4 用の処理
 }
}

public class AnythingExecutorFactory{
 public static AnythingExecutor create(){
  // JRE のバージョンを取得する
  if( 1.4 だった){
   return new AnythingExecutor14 ();
  }
  else if( 1.5 だった){
   return new AnythingExecutor15 ();
  }
  ...
 }
}

// 実際の処理
AnythingExecutor executor = AnythingExecutorFactory.create();
executor.doAnything();

901:デフォルトの名無しさん
08/02/28 00:23:16
>>898
それは Java に対する質問ではない。
適当なスレを探すよろし。

902:デフォルトの名無しさん
08/02/28 00:29:32
>>898
問題ないんじゃないか。setter/getter があるってことは、すなわち
public フィールドとほとんど等値なんだし。

ただ、フィールドへのアクセスと同時に何かしたい、外部からは
read のみに変えたい、みたいなことってことが結構ある。
そこで、フィールドは private にして隠す。アクセスは public な
getter/setter からのみ。というよくある構成に統一することで、
機能追加に対応しやすくなるからこうしましょう、という寸法。

中には「フィールドへのアクセスもオブジェクトに対する"操作"で
あるから、メソッドであるべき」なんていう人もいると思う。
まぁその辺をどう割り切るかは個人個人によるのでは。

あと委譲の話と何が関係あるのかが分からなかった。

903:デフォルトの名無しさん
08/02/28 01:11:04
>>902
> 問題ないんじゃないか。setter/getter があるってことは、すなわち
> public フィールドとほとんど等値なんだし。

1つ大きな違いがあるぞ。setter/getterの場合、本来は違うものを同じものに見せ掛けるのが簡単にできる。
後付けで振舞いを変えるとか、透過的に処理を割り込ませたりするとか、実体をリモートに持たせるとか。

904:デフォルトの名無しさん
08/02/28 01:33:31
setter/getterメソッドをわざわざ追加する意味がさっぱりわかなかったので
publicフィールドにガンガンアクセスするコードを書いてるのですが、ひょっとして一般的じゃないんですか?
>>903さんがどういう処理を指してるのかいまいちつかめません。。

905:デフォルトの名無しさん
08/02/28 01:38:00
>>896,900
うわー、ありがとうございます!
早速試してみます。

906:デフォルトの名無しさん
08/02/28 01:38:32
>>877
やさしいなー


次ページ
最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

4270日前に更新/275 KB
担当:undef