2011-04-27 62 views
0

Java中没有“out”或“ref”参数(我可能错了,因为我在3年内没有碰到Java)。我想创建类,如MyInteger,MyFloat和MyDouble,被用作out参数。有没有办法将它们组合成一个泛型类?对于MyInteger类用作输出参数的自定义编号类

示例代码:

public class MyInteger 
{ 
    private int value = 0; 

    public int getValue(){ return value;} 
    public void setValue(int newValue) {value = newValue;} 

} 

编辑:

如何使用MyInteger类:

public boolean aMethod(int input, MyInteger output) 
{ 
    boolean status = true; 
    //calculation here; 
    //set status to false if anything wrong; 
    //if nothing wrong do this: output.setValue(newValue); 
    return status; 
} 

编辑2:

什么我问的是我希望我可以将MyInteger,MyFloat ......合并为一个通用类。

+0

你是问有关调用通过JDBC存储的过程与输出参数? – Kal 2011-04-27 14:14:06

+0

您是否重新创建类似http://download.oracle.com/javase/6/docs/api/java/lang/Integer.html的包装类? – 2011-04-27 14:16:25

+0

我仍然不明白你为什么需要这个功能。你的意思是出于/ ref究竟是什么意思? – 2011-04-27 14:22:57

回答

3

除了这个事实,输出参数是有点尴尬,我不会建议他们,你为什么不使用Integer之类的?

因为它们都继承Number你可以这样做:

public class MyNumber<T extends Number> 
{ 
private T value = null; 

... 
} 
+0

我想,没有办法给Integer实例分配一个新的值。作为输出参数,它应该能够在被调用的方法中携带一个新的值。 – 5YrsLaterDBA 2011-04-27 14:23:51

+1

是的,这就是为什么我建议'MyNumber '然后可以是'MyNumber '的例子。有了这个,你可以调用'myNumber.setValue(1);'或 - 不用自动装箱 - 'myNumber.setValue(new Integer(1));' – Thomas 2011-04-27 14:50:39

0

你可以让你的新类的子类Number。 Integer,Float等唯一的原因是不可变的,因为这就是它们的实现方式。

或者,您可以创建一个NumberHolder类,您可以传递一个具有可变数字字段的类。

class NumberHolder { 

    private Number num; 

    public void setNumber(Number num) { 
    this.num = num; 
    } 

    public void getNumber() { 
    return num' 
    } 

} 
+0

你可以使这个通用,所以你可以改变它。 – 2011-04-27 14:19:43

+0

但我看不到我如何使用它作为整数,浮点数和双精度? – 5YrsLaterDBA 2011-04-27 14:26:21

2

恕我直言,如果你使用的对象/访客模式正确,你永远不应该需要从方法返回多个值。

返回其包含多于一个的值

public Pair<Integer, Double> method3(); 

,或者使用访问者收到多于一个的值的对象。有用的,如果你可以很多出来/错误。

public interface Visitor { 
    public void onValues(int i, double d); 
    public void onOtherValues(double d, String message); 
} 

method(Visitor visitor); 

或者你可以更新被调用的对象方法,而不是返回值。

public void method() { 
    this.i = 10; 
    this.d = 100.0; 
} 

例如,

Worker worker = new Worker(); 
worker.method(); 
int i = worker.i; 
double d = worker.d; 

或者您可以返回一个条件的有效值。

// returns the number of bytes read or -1 on the end of the file. 
public int read(byte[] bytes); 

// index of the search key, if it is contained in the array within the specified range; otherwise, (-(insertion point) - 1) 
public int binarySearch(Object[] array, Object key); 

有一个通用支架,你可以使用AtomicReference

public void method(AtomicReference<Integer> i, AtomicReference<Double> i); 

对于某些类型有一个内置式的AtomicBoolean,的AtomicInteger,AtomicLong的

public void method(AtomicBoolean flag, AtomicInteger len); 
// OR 
public boolean method(AtomicInteger len); 

你也可以使用普通数组

int[] i = { 0 }; 
double[] d = { 0.0 }; 
method2(i, d); 

public void method2(int[] i, double[] d); 
+1

好的答案,包含我能想到的所有可能的解决方案(+1) – 2011-04-27 14:27:46

+0

return只有一个值,但不是从方法返回,我期望它是由参数返回。例如,我希望该方法在计算后返回true或false,并且还需要计算结果编号,该编号将由参数 – 5YrsLaterDBA 2011-04-27 14:31:30

+0

@Joachim执行,感谢您修复拼写错误。 – 2011-04-27 14:38:54

4

可以使用的AtomicInteger,AtomicLong的,等的AtomicReference他们这样做你的建议什么,以及作为一个附加的功能,它们是高度线程安全


并因应此评论:

但为什么没有AtomicFloat和 AtomicDouble

这里是the java.util.concurrent.atomic package JavaDocs说:

此外,类只对那些通常是 有用的预期应用类型提供 。例如,对于 示例, 没有代表byte的原子类。在那些您不愿意这样做的情况下,您可以使用AtomicInteger来保存 字节值,并进行适当的转换。 也可以使用 Float.floatToIntBitsFloat.intBitstoFloat转换,并使用Double.doubleToLongBitsDouble.longBitsToDouble 转换 双打持有浮动。

我自己的看法:这听起来非常复杂,我会去与AtomicReference<Double>AtomicReference<Float>等代替

+0

是的,绝对。 OP的“MyInteger”类在这种情况下做了他想要的(在aMethod中调用output.setValue(whatever)),但是当Atomic *存在时,不需要重新创建持有者类。 – CPerkins 2011-04-27 15:36:30

+0

但为什么没有AtomicFloat和AtomicDouble? – 5YrsLaterDBA 2011-04-27 16:29:27

+0

@ 5YrsLaterDBA查看我更新的答案 – 2011-04-27 16:39:13