自定义数字类用作out参数

时间:2011-04-27 14:08:13

标签: java

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,...组合成一个通用类。

4 个答案:

答案 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'
  }

}