2013-12-10 135 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