Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否有一个标准类包装引用并提供getter和setter?_Java_Wrapper - Fatal编程技术网

Java 是否有一个标准类包装引用并提供getter和setter?

Java 是否有一个标准类包装引用并提供getter和setter?,java,wrapper,Java,Wrapper,对不起,我问了个愚蠢的问题 我非常确定,Java API提供了一个封装引用的类, 并为其提供一个getter和setter class SomeWrapperClass<T> { private T obj; public T get(){ return obj; } public void set(T obj){ this.obj=obj; } } class-SomeWrapperClass{ 私人T obj; public T get(){retu

对不起,我问了个愚蠢的问题

我非常确定,Java API提供了一个封装引用的类, 并为其提供一个getter和setter

class SomeWrapperClass<T> {
    private T obj;

    public T get(){ return obj; }

    public void set(T obj){ this.obj=obj; }
}
class-SomeWrapperClass{
私人T obj;
public T get(){return obj;}
公共无效集(T obj){this.obj=obj;}
}
我说得对吗?JavaAPI中有类似的东西吗

多谢各位

是的,我可以自己写,但我为什么要模仿现有的功能呢

编辑:我想用它作为参考 参数(如C#中的ref关键字)或更具体的参数, 能够“写入方法参数”;)

有,但它是不可变的(setter缺失)。java.lang.ref文档说明:

每个引用对象都提供获取和清除引用的方法。除了清除操作外,引用对象在其他方面是不可变的,因此不提供set操作。程序可以进一步对这些子类进行子类化,添加其目的所需的任何字段和方法,也可以使用这些子类而不做任何更改

编辑

void refDemo(MyReference<String> changeMe) {
   changeMe.set("I like changing!");
   ...
void refDemo(MyReference changeMe){
设置(“我喜欢改变!”);
...
呼叫者:

String iWantToChange = "I'm like a woman";
Reference<String> ref = new MyReference<String>(iWantToChange)
refDemo(myRef);
ref.get(); 
String-iWantToChange=“我像个女人”;
Reference ref=新的MyReference(iWantToChange)
refDemo(myRef);
ref.get();

不过,我不喜欢它,代码太多。这种功能必须在语言级别上得到支持,就像在C#中一样。

…好问题,但没有遇到。我投反对票

……嗯,经过一些反思,反思可能是接近它的东西:

有一个类提供了这一功能。它的存在主要是为了确保原子性,尤其是getAndSet()和compareAndSet()方法,但我想它可以满足您的需要。

我不清楚这是为了什么,但您可以使用该类型的一个子类。它们在构造函数中设置引用,而不是在setter中设置引用


值得指出的是,引用子类主要用于促进垃圾收集,例如,当与一起使用时。

我很想问您为什么想要其中的一个,但我假设是这样,您可以从一个函数返回多个对象

每当我想这样做时,我都会使用数组或容器对象

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.
}

如果您试图从一个函数返回多个值,我将创建一个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; }
}
类对{
A A;
B B;
公共无效对(){}
公共无效对(A、B){
这个a=a;
这个.b=b;
}

当我在编写C++多年后开始java编程时,我就担心不能从函数返回多个对象。 事实证明,这不仅是可能的,而且也改善了我的程序设计


然而,Java对CORBA的实现使用单元素数组来通过引用传递内容。这也适用于基本类型。

我认为没有专门为您设计的Java API类,我更喜欢您的示例(包装器类),然后使用这种“数组技巧”因为您可以稍后插入一些防护,或者可以通过方面或反射检查一些想法,并且您可以添加横切关注点功能的特性


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

您想用它做什么?@Rich:可以。但是这些子类有特定的语义(以及相关的开销)这使得他们的答案是错误的。@Stephen我在第二段中说的差不多,不是吗?@Rich。我不这么认为。你的话不是这样说的,或者(依我看)甚至不是他们的意思。“主要是为了方便垃圾收集。”解决了特定的语义,不是吗?@Rich。不,不是。它只说明这些类是为不同的任务设计的。它并没有说它们对于这个任务是错误的。你想在这里如何使用反射?它的函数比编写非原子函数慢吗?它们肯定会慢一点,因为它们是线程定义的安全,因此需要某种形式的同步。虽然在设置方法参数一次的上下文中,我很难想象这可能会有明显的不同。出于这个原因,编写自己的优化肯定是过早的。清晰可能是一个更好的原因-您不需要原子引用,您需要ant是推荐人。
/* 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) {
...
}