Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

クラスの値をインクリメントするメソド

クラスのint型の値をインクリメントするメソッドを作成したいのですが教えてください。

Class ABClass
{
  int a,b,c;
  String s;
}

ABClass abc;

IncreClass ic;
ic.increment(abc); //abcのint型フィールドをすべてインクリメント


IncreClass.increment(Obj obj)
を作成したいのですがどうしたらいいですか?

17

回答

6665

閲覧

17件の回答

評価

0

日本語で考えてみる。

もし(引数で渡されたオブジェクトが、ABClassのインスタンスだったら){

オブジェクトをABClassにキャスト
それぞれの値をインクリメント

}

でokですよ。

評価

0

方法 = コロの回答

if(方法 == 汎用性がある)
{
  puts("すばらしい方法だ");
}
else
{
 puts("汎用性がないのでだめ");
}

実行結果:
汎用性がないので ぜ ん ぜ ん ダメ

評価

0

何?
ケンカを売りに来てるの?


とりあえず汎用性を求めるなら
そうね、
incrementというメソッドともった
Increaseというインターフェースを用意しておいて
ic.increment(abc);で呼び出したいクラス
たとえばここで言うならABClassね。
そのクラスにIncreaseインターフェースを実装。
incrementメソッドではint型のフィールドを
インクリメントするように実装する。
あとはIncreClass.increment(Obj obj)で
objがIncreaseを実装しているかどうか判定して、
実装していたらobjeのincrementメソッドを実行して
あげればいいわ。
これが最適解よ。

評価

0

また上から目線の教えて君か><

汎用性ってなに?
ABCクラスの型を知らずに、int型メンバをインクリメントしろってこと?

評価

0

いっそのこと、てんこ氏の案に加えて、
定義するメソッドはexecute()にして、
それ以外、publicなメソッドは追加不許可、にしちまいなよ。

評価

0

知らない間にレスが。

プログラムと実行結果が違う事が気になります。


汎用性を持たせるとしたらジェネリクスを使うかなぁ。
何をもって汎用的だと言うかがわからないです。

評価

0

ic.increment(abc);
abcがどんな型のクラスでも適用できること

どうしたらいいですか?

評価

0

> 汎用性とは?さん
質問主?

回答:
Javaの世界では不可能よ。
ネイティブなアプリで
メモリアクセスしてとかなら
可能かもしれないけど。
そっちは詳しくないわ。

評価

0

import java.lang.reflect.*;

public class Incrementer {
    public static void main(String[] args) {
        IncreClass ic = new IncreClass();
        ABClass abc = new ABClass();
        abc.print();
        ic.increment(abc);
        abc.print();
        for (int i = 0; i < 5000; i++) ic.increment(abc);
        abc.print();
    }
}

class IncreClass {
    void increment(Object obj) {
        try {
            Class c = obj.getClass();
            for (Field f : c.getDeclaredFields()) {
                if (f.getType() == Integer.TYPE) {
                    f.setAccessible(true);
                    f.setInt(obj, f.getInt(obj) + 1);
                }
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }
}

class ABClass {
    int a, b, c;
    String s;
    public void print() {
        System.out.printf("a: %d, b: %d, c: %d\n", a, b, c);
    }
}
// 宿題っぽいけどまぁいいや

評価

0

そいやリフレクションなんてあったわね。
最近使ってなかったからすっかり忘れていたわ。

評価

0

確かにリフレクション使えばできるけど、こんなものを「汎用性がある」と考えるのは間違いだと思う。

評価

0

つうか、なんでそんな訳分からんもん作りたいの。

評価

0

だからObjectを返すexecute()があればいいじゃん。
究極の汎用性だろ。jk

評価

0

オブジェクト指向ってなんだろうな…。

評価

0

冗長な気がしますが、
こういうのも一つアリなんでしょうかね。
abc.incrementで良いじゃんとも思ってしまうのですが。

interface Increment {
    void increment();
}
class ABClass implements Increment {
    int field;
    public void increment() {
        field++;
    }
}
class IncreClass<T extends Increment> {
    public void incrementObj(T t) {
        t.increment();
    }
}
public class Sample {
    public static void main(String[] args) {
        ABClass abc = new ABClass();
        IncreClass<ABClass> sample = new IncreClass<ABClass>();
        sample.incrementObj(abc);
        System.out.println(abc.field);
    }
}

評価

0

incrementが元だと難しいけど、interfaceなら、たとえばIncrementalか?
もっともな英単語が出てこないのは、やっぱり考え方が(ry

んなことはさておき、それはてんこ氏が2009-03-02 02:00で書いてるものでしょ。
元の質問者は、既存のクラスに手を加えることなく、共通して使える方法(Object#hashCode()みたいな)が欲しいと言ってるんだから、意味をなさないだろう。
質問者の意図を正確に叶えるなら、2009-03-04 01:43のようなリフレクションしか思いつかない。

最近のMicrosoft.NETだと、既存クラスに後からメソッドを追加できるんだよな(実際にはコンパイラが良きに計らってるだけだけど)。
基底クラスのObjectに追加すればいけそうだ。

評価

0

ん?その場合でも結局リフレクションでなきゃそれぞれのフィールドが取れんから、一緒か…。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。