2013-12-10 137 views
0

这是比代码更具逻辑性的问题,我有二十个函数,每个函数计算两个我感兴趣的值。不过,我只能从函数返回一个值。现在我拥有的另一个选择是创建一个类并使用全局变量实现setter和getter。我想知道这是否是一种可行和推荐的方式?或者有更好的方法来做到这一点?如何从函数返回多个值。

回答

3

不要使用全局变量!使用一些将您的数据作为私人文件夹的类,并为其提供getter。像

class Pair<A,B> { 
    final A one; 
    final B two; 
    public Pair(A fst, B snd) { one = fst; two = snd; } 
    public A getFst() { return one; } 
    public B getSnd() { return two; } 
} 

然后你就可以在其他地方这样说:

return new Pair(42, "a result"); 
+0

一个更好的建议,保存多种类型+ 1 :) – Sage

+0

我会去与此。 – User3

1

从包含感兴趣值的函数中返回一个Collection

+1

一个数组列表,你是什么意思?这样我就不需要把它分成两类。虽然我可能不得不考虑类型安全。 – User3

+0

取决于你的意图返回。如果它们是唯一值,则可以使用Set或者如果它们是键值,则可以使用Map。 –

1

您必须退回Listarray

但是,如果return类型不同,您可以创建自定义类并将其用作返回类型。

public class Result { 
    private String name; 
    private int age; 

    // getters and setters; 
} 

现在你可以有一些东西像下面

public static Result getInfo(){ 
    Result result=new Result(); 
    result.setName("name"); 
    result.setAge(10); 
    return result;//now you can have String and int values return from the method 
} 
+0

我认为在我的情况下,第二个选项是首选,我的数据类型是非常不同的,浮点差异可能会导致我的问题。 – User3

1

取决于问题。但有两种解决方案:

  1. 创建新的类将由所有这些函数返回哪些实例。这个类将为每个需要的答案提供2个属性。
  2. 返回数组或集合这2个答案。
0

如果您确定“〜”不会出现在结果中,您甚至可以返回由特殊字符分隔的值,例如“〜”。

+1

丑陋的黑客 - 也许COBOL在半个多世纪前推出了唱片! –

1

你可以做到这一点

long[] function() { 
    long[] ret = { a, b }; 
    return ret; 
} 

long[] a = { 0 }, b = { 0 }; 

void function(long[] a, long[] b) { 
    a[0] = ... 
    b[0] = ... 

或添加属性的对象。

private long a,b; 

void function() { 
    a = ... 
    b = ... 
} 

在最后一种情况下,您可以对其进行评估。

class Results { 
    public final long a; 
    public final Date b; // note: Date is not immutable. 
    // add constructor 
} 

public Results function() { 
    long a = ... 
    Date b = ... 
    return new Results(a, b); 
} 
+0

类型安全是一个问题。 – User3

+0

@ user2822178你的计算类型是什么? –

+1

我想阻止#2,即让方法影响对象的状态。当然,在某些情况下它可能是合适的,但总的来说可能应该避免。 – Smallhacker

1

我觉得制作记录类是最适合的。

public class Record { 
    public final int a; 
    public final int b; 

    public Record(final int a, final int b) { 
     this.a = a; 
     this.b = b; 
    } 
} 

那么你的函数可以返回类型Record,并且您可以访问它与假设record.arecord.b

这也是少数情况下public变量和没有getter和setter可以证明的情况之一。

UPDATE:实现提议的变更,现在一切都final,这意味着Record不能,当你把它找回来,这似乎是符合预期修改。您只需想要结果并使用这些。

+1

我会避免没有参数的构造函数,并使字段为'final',但除此之外,自定义记录是最干净的解决方案... –

+0

@GyroGearless确实如此,确实如此,如果所有你想要的都是两个返回值。 – skiwi

1

有很多方法:集合,数组... 在我看来,唯一的方法是定义一个类与这些值。 你不需要getter和setter方法,如果你并不需要规范的内容

class MyReturnValue { 
    public int a; 
    public int b; 
} 

在你的代码的可见性:

... 
MyReturnValue result=new MyReturnValue(); 
result.a=5; 
result.b=6; 

return result; 
1

这是更好地做一个类并实现二传手并且使用全局变量而不是返回集合进一步取决于您的使用。

1

怎么样采取varargs与周边返回变量限制的数量越来越通用的辅助函数:在这个解决方案,我们不会每次都声明一个新的类时返回变量的数量变化

class Results 
{ 
    private final Object[] returnedObj; 

    public Results(Object... returnedObj) 
    { 
     this.returnedObj = returnedObj; 
    } 

    public <E> E getResult(int index) 
    { 
     return (E)returnedObj[index]; 
    } 


} 

测试用例:

public static Results Test() 
{ 
     return new Results(12, "ABCD EFG", 12.45); 
      // or return larger number of value 
} 

//// And then returning the result 

Results result = Test(); 
String x = result.<String>getResult(1); 
System.out.println(x); // prints "ABCD EFG" 
+0

伟大的这个解决方案! – User3