4

愚かな質問で申し訳ありません。

Java API が参照をラップするクラスを提供し、それに getter と setter を提供することは確かです。

class SomeWrapperClass<T> {
    private T obj;

    public T get(){ return obj; }

    public void set(T obj){ this.obj=obj; }
}

私は正しいですか?Java APIにこのようなものはありますか?

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

はい、自分で書くことはできますが、なぜ既存の機能を模倣する必要があるのでしょうか?

編集:参照パラメーター (C# のrefキーワードなど)、またはより具体的には、「メソッドパラメーターに書き込む」ことができるようにするために使用したかった;)

4

8 に答える 8

7

これを提供するAtomicReferenceクラスがあります。主に、特に getAndSet() および compareAndSet() メソッドで原子性を確保するために存在しますが、それはあなたが望むことをすると思います。

于 2009-08-09T13:32:36.137 に答える
1

何年にもわたって C++ を書いた後、Java でプログラミングを始めたとき、関数から複数のオブジェクトを返すことができないという事実が気になりました。

それが可能であるだけでなく、プログラムの設計も改善されていることがわかりました。

ただし、Java の CORBA の実装では、単一要素の配列を使用して参照渡しを行います。これは基本型でも機能します。

于 2009-08-10T12:39:58.093 に答える
0

java.lang.ref.Referenceがありますが、不変です(セッターがありません)。java.lang.ref のドキュメントには次のように書かれています。

すべての参照オブジェクトは、参照を取得およびクリアするためのメソッドを提供します。クリア操作を除けば、参照オブジェクトは不変であるため、設定操作は提供されません。プログラムは、これらのサブクラスをさらにサブクラス化して、その目的に必要なフィールドとメソッドを追加するか、これらのサブクラスを変更せずに使用することができます。

編集

void refDemo(MyReference<String> changeMe) {
   changeMe.set("I like changing!");
   ...

呼び出し側:

String iWantToChange = "I'm like a woman";
Reference<String> ref = new MyReference<String>(iWantToChange)
refDemo(myRef);
ref.get(); 

私はそれが好きではありませんが、コードが多すぎます。この種の機能は、C# のように言語レベルでサポートする必要があります。

于 2009-08-09T13:31:02.580 に答える
0

...良い質問ですが、まだ見つけていません。私は反対票を投じます。

....うーん、いくつかの反射の後、反射はそれに近づくものかもしれません: http://java.sun.com/developer/technicalArticles/ALT/Reflection/

于 2009-08-09T13:31:10.940 に答える
0

これが何のためにあるのかはわかりませんが、参照型のサブクラスの 1 つを使用できます。セッターではなくコンストラクターで参照を設定します。

Reference サブクラスは、たとえばWeakHashMapと組み合わせて使用​​する場合など、主にガベージ コレクションを容易にすることを目的としていることを指摘する価値があります。

于 2009-08-09T13:32:54.123 に答える
0

関数から複数の値を返そうとしている場合は、タプルのように機能する Pair、Triple、&c クラスを作成します。

class Pair<A,B> {
A a;
B b;
public void Pair() { }
public void Pair(A a,B b) {
this.a=a;
this.b=b;
}
public void Pair( Pair<? extends A,? extends B> p) {
this.a=p.a;
this.b=p.b;
}
public void setFirst(A a) { this.a=a; }
public A getFirst() { return a; }
public void setSecond(B b) { this.b=b; }
public B getSecond() { return b; }
}

これにより、2つの(技術的には無限の)戻り値を返すことができます

/* Reads a line from the provided input stream and returns the number of
 * characters read and the line read.*/
public Pair<Integer,String> read(System.in) {
...
}
于 2009-08-10T12:28:51.270 に答える
0

なぜこれらのいずれかが必要なのかを尋ねたくなりますが、関数から複数のオブジェクトを返すことができるようにするためだと思います...

それをしたいときはいつでも、配列またはコンテナオブジェクトを使用しました...

bool doStuff(int params, ... , SomeObject[] returnedObject)
{
    returnedObject[0] = new SomeObject();
    return true;
}

void main(String[] args)
{
    SomeObject myObject;
    SomeObject[1] myObjectRef = new SomeObject[1];
    if(doStuff(..., myObjectRef))
    {
        myObject = myObjectRef[0];
        //handle stuff
    }
    //could not initialize.
}
于 2009-08-09T13:34:04.947 に答える
0

あなたの意図のために設計されたJava APIクラスはないと思います。後でいくつかのガードを挿入したり、アスペクトやリフレクションを介していくつかの考えをチェックしたりできるため、この「配列トリック」を使用して、あなたの例(ラッパークラス)を好むでしょう。分野横断的な機能である機能を追加できます。

しかし、それがあなたがやりたいことであることを確認してください!たぶん、再設計して別のソリューションにたどり着くことができますか?

于 2009-08-10T12:53:23.197 に答える