2013-03-08 47 views
6

Tôi đang sử dụng trình mô phỏng để phát craps và tôi đang cố gắng trả lại hai giá trị từ cùng một phương thức (hoặc đúng hơn là tôi muốn).Có thể trả về nhiều hơn một giá trị từ một phương thức trong Java không?

Khi tôi viết câu trả lại, tôi chỉ đơn giản thử đặt "&" được biên dịch và chạy đúng cách; nhưng tôi không có cách nào để truy cập vào giá trị trả về thứ hai.

public static int crapsGame(){ 
    int myPoint; 
    int gameStatus = rollagain; 
    int d1,d2; 
    int rolls=1; 

    d1 = rollDice(); 
    d2 = rollDice(); 
    switch (d1+d2) { 
    case 7: 
    case 11: 
     gameStatus = win; 
     break; 
    case 2: 
    case 3: 
    case 12: 
     gameStatus = loss; 
     break; 
    default: 
     myPoint = d1+d2; 
     do { 
     d1=rollDice(); 
     d2=rollDice(); 
     rolls++; 
     if (d1+d2 == myPoint) 
      gameStatus = win; 
     else if (d1+d2 == 7) 
      gameStatus = loss; 
     } while (gameStatus == rollagain); 
    } // end of switch 
    return gameStatus & rolls; 
} 

Khi tôi trả về giá trị như:

gameStatus=crapsGame(); 

Nó thích hợp đặt varaible để thắng hay thua nhưng nếu tôi cố gắng một cái gì đó đơn giản như sau tuyên bố rằng với:

rolls=crapsGame(); 

Nó được gán giá trị giống như gamestatus ... 0 hoặc 1 (thắng hay thua). Bất kỳ cách nào để tôi có thể truy cập giá trị trả lại thứ hai? Hoặc là có một cách hoàn toàn khác để đi về nó?

+0

sử dụng mảng đối tượng hoặc băm hoặc mô hình lớp –

+5

Không. Bạn có thể trả lại một đối tượng và đối tượng đó có thể chứa nhiều thuộc tính –

+0

Bạn nên trả về một int []. Thanh toán http://docs.oracle.com/javase/tutorial/java/nutsandbolts/arrays.html – sissonb

Trả lời

9

Tạo đối tượng giữ giá trị của riêng bạn để giữ cả hai giá trị, sau đó trả về giá trị đó.

return new ValueHolder(gameStatus, rolls); 

Có thể trả về một mảng có nhiều giá trị, nhưng điều đó thật khó hiểu và không có gì để đọc được. Việc hiểu điều này có nghĩa là gì hơn ...

valueHolder.getGameStatus() 

so với ý nghĩa của điều này.

intArray[0] 
+0

Tôi cũng sẽ trả lại giá trị cho một người có giá trị như thế nào? Như trong tuyên bố: gameStatus = crapsGame(); điều gì sẽ giữ giá trị của người giữ giá trị; Nếu mà làm cho bất kỳ ý nghĩa? Xin lỗi nếu điều này nghe có vẻ ngu ngốc ... Tôi hoàn toàn không quen thuộc với ValueHolder – OscarWilde

+0

ValueHolder là một lớp mà bạn sẽ tạo - một đối tượng tùy chỉnh. Sau đó, bạn sẽ viết một cái gì đó như 'ValueHolder valueHolder = crapsGame();' – rgettman

+0

cảm ơn bạn! Tôi đã đi với phương pháp mảng vì nó là hơi đơn giản (nhìn thấy như tôi chỉ cần hai giá trị) nhưng tôi đánh giá cao sự trả lời và công đức của phương pháp này! Thêm vào đó, tôi đã học được điều gì đó thêm mà luôn luôn là tốt đẹp; bởi vì tôi chưa bao giờ nghe nói về "ValueHolder"! – OscarWilde

5

trở gameStatus & rolls có nghĩa là "trả lại Bitwise và gameStatus và cuộn" mà có lẽ không phải là những gì bạn muốn

bạn có một số tùy chọn ở đây:

  • trở lại một mảng
  • tạo một lớp đại diện cho phản hồi với thuộc tính cho từng giá trị và trả lại một cá thể
  • sử dụng một trong nhiều bộ sưu tập java để lại chuyển các giá trị (có thể là danh sách hoặc bản đồ)
+0

Tôi đã kết thúc với phương pháp mảng nhưng tôi đã tự hỏi nếu bạn có thể mở rộng một chút về "trả lại bitwise và của gameStatus và cuộn" Tôi đã thực sự trở lại khi tôi nhập nó như thế? – OscarWilde

+0

@OscarWilde chắc chắn: bitwise và toán tử & sẽ áp dụng một logic VÀ một bit tại một thời điểm trên hai toán hạng của nó (kiểm tra này ra: http://docs.oracle.com/javase/tutorial/java/nutsandbolts/op3.html) –

3

Bạn có thể trả lại một mảng giá trị hoặc Tập hợp giá trị.

3

Có thể trả lại nhiều giá trị từ một phương thức trong Java không?

Không có. Java chỉ cho phép một giá trị được trả về. Hạn chế này là khó có dây vào ngôn ngữ.

Tuy nhiên, có một vài cách để đối phó với hạn chế này:

  • Viết nhẹ lớp "chủ sở hữu" với các lĩnh vực cho nhiều giá trị bạn muốn quay trở lại, và tạo ra và trả về một thể hiện của lớp đó.
  • Trả lại Map chứa các giá trị. Vấn đề với cách tiếp cận này (và tiếp theo) là bạn đang đi lạc vào một khu vực yêu cầu kiểm tra kiểu thời gian chạy ...và điều đó có thể dẫn đến sự mong manh.
  • Trả về một mảng chứa các giá trị. Mảng phải có loại cơ sở sẽ chứa các loại của tất cả các giá trị.
  • Nếu đây là một phương pháp trên một đối tượng, sau đó thêm một số trường trên cùng một đối tượng và phương pháp cho phép người gọi nhận "kết quả phụ trợ" từ cuộc gọi cuối cùng. (Ví dụ, lớp JDBC ResultSet thực hiện điều này để cho phép một máy khách xác định xem giá trị vừa lấy ra là NULL.) Vấn đề là điều này làm cho lớp không reentrant ở cấp độ cá thể.
  • (Bạn thậm chí có thể trả lại kết quả bổ sung trong tĩnh học, nhưng nó là một ý tưởng thực sự xấu. Nó làm cho lớp không reentrant trên tất cả các trường hợp, chưa kể đến tất cả các badnesses khác liên quan đến tĩnh học sai lầm.)

Trong số này, tùy chọn đầu tiên là tùy chọn sạch nhất. Nếu bạn đang lo lắng về chi phí của việc tạo ra các cá thể chủ, vv, bạn có thể xem xét việc tái sử dụng các cá thể; ví dụ. có người gọi vượt qua một "chủ sở hữu" hiện có đến phương thức được gọi để đặt kết quả.

0

Bạn có thể sau cách để làm điều này:

  1. Sử dụng một lớp container, ví dụ

    public class GameStatusAndRolls { 
        String gameStatus; 
        String rolls; 
        ... // constructor and getter/setter 
    } 
    public static GameStatusAndRolls crapsGame(String gameStatus, String rolls) { 
        return new GameStatusAndRolls(gameStatus, rolls); 
    } 
    public static void main(String[] args) { 
        ... 
        GameStatusAndRolls gameStatusAndRolls = crapsGame(gameStatus, rolls); 
        gameStatusAndRolls.getGameStatus(); 
    
  2. Sử dụng List hoặc một array, ví dụ

    public static List<Integer> crapsGame(String gameStatus, String rolls) {   
        return Arrays.asList(gameStatus, rolls); 
    } 
    private static final int GAME_STATUS = 0; 
    private static final int ROOLS = 0; 
    public static void main(String[] args) { 
        ... 
        List<Integer> list = crapsGame(gameStatus, rolls); 
        ... list.get(0)...list.get(GAME_STATUS); 
        ... list.get(1)...list.get(ROOLS); 
    

    hoặc

    public static String[] crapsGame(String gameStatus, String rolls) {   
        return new String[] {gameStatus, rolls}; 
    } 
    private static final int GAME_STATUS = 0; 
    private static final int ROOLS = 0; 
    public static void main(String[] args) { 
        ... 
        String[] array = crapsGame(gameStatus, rolls); 
        ... array[0]...array[GAME_STATUS]; 
        ... array[1]...array[ROOLS]; 
    
  3. Sử dụng Map, ví dụ

    public static Map<String, String> crapsGame(String gameStatus, String rolls) { 
        Map<String, String> result = new HashMap<>(2); 
        result.put("gameStatus", gameStatus);   
        result.put("rolls", rolls); 
        return result; 
    } 
    public static void main(String[] args) { 
        ... 
        Map map = crapsGame(gameStatus, rolls); 
        ... map.get("gameStatus")...map.get("rolls"); 
    
2

Các thực hành tốt nhất cho một cách tiếp cận OOP là để trả về một đối tượng. Một đối tượng chứa tất cả các giá trị bạn muốn.

Ví dụ:

class Main { 

    public static void main(String[] args) { 

     MyResponse response = requestResponse(); 

     System.out.println(response.toString()); 

    } 

    private static MyResponse requestResponse() { 

     return new MyResponse("this is first arg", "this is second arg"); 
    } 
} 

class MyResponse { 

    private String x, y; 

    public MyResponse(String x, String y) { 

     this.x = x; 
     this.y = y; 

    } 

    @Override 
    public String toString() { 

     return "x: " + x + "\t y: " + y; 
    } 

} 

Nếu bạn muốn một cách tiếp cận thậm chí khả năng mở rộng nhiều hơn thì bạn phải sử dụng phản ứng JSON. (Hãy cho tôi biết nếu bạn muốn có một ví dụ với JSON quá)

+0

Câu hỏi này là từ 3 năm trước ... tại sao tôi đột nhiên nhận được hai câu trả lời mới tối nay? – OscarWilde

+0

Chỉ hiển thị với phần "mới nhất" của người đàn ông. Không biết. – NikosKeyz

Các vấn đề liên quan