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 :(得分:4)
您可以使用AtomicInteger,AtomicLong,AtomicReference等。它们完全符合您的建议,并且作为一项附加功能,它们具有高度线程安全性
回应此评论:
但为什么没有AtomicFloat和 AtomicDouble
以下是the java.util.concurrent.atomic
package JavaDocs所说的内容:
此外,还提供了课程 仅适用于那些常见的类型 适用于预期的应用。对于 例如,没有原子类 代表
byte
。在那些不常见的 你想这样做的情况, 您可以使用AtomicInteger
来保留 字节值,并适当地转换。 您也可以使用浮动Float.floatToIntBits
和Float.intBitstoFloat
次转化,以及 使用Double.doubleToLongBits
加倍 和Double.longBitsToDouble
转化
我自己的看法:听起来非常复杂,我会选择AtomicReference<Double>
,AtomicReference<Float>
等等。
答案 1 :(得分:3)
除了out参数有些尴尬并且我不推荐它们之外,为什么不使用Integer
之类的呢?
因为它们都可以扩展Number
:
public class MyNumber<T extends Number>
{
private T value = null;
...
}
答案 2 :(得分: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;
}
e.g。
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);
答案 3 :(得分:0)
您可以让新类的子类为Number。唯一的原因是Integer,Float等是不可变的,因为这就是它们的实现方式。
或者,您可以创建一个传递的NumberHolder类,它具有可变的Number字段。
class NumberHolder {
private Number num;
public void setNumber(Number num) {
this.num = num;
}
public void getNumber() {
return num'
}
}