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

如果您尝试从函数返回多个值,我将创建一个类似于元组的 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

我认为没有为您的意图设计的 Java API 类,我也更喜欢您的示例(包装器类)然后使用这个“数组技巧”,因为您可以稍后插入一些守卫,或者可以通过方面或反射检查多个想法,然后您'能够添加跨领域关注的功能。

但请确保这就是您想要做的!也许您可以重新设计并找到其他解决方案?

于 2009-08-10T12:53:23.197 回答
0

java.lang.ref.Reference,但它是不可变的(缺少 setter)。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

我不清楚这是做什么用的,但您可以使用Reference类型的子类之一。他们在构造函数而不是 setter 中设置引用。

值得指出的是,Reference 子类主要用于促进垃圾收集,例如与WeakHashMap结合使用时。

于 2009-08-09T13:32:54.123 回答
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 回答