Как вернуть несколько значений из метода в Java - PullRequest
1 голос
/ 30 апреля 2019

Я написал метод в Java, который возвращает 2 значения. 1-й счетчик результата типа int и 2-й, если метод имеет логический тип true / false. Как я могу вернуть оба значения? Так что если метод успешен, тогда только продолжайте.

Пример кода:

public static void main(String args[])
{
    int count = 0;
    boolean status = false;
    //count = retrieveData(); Current code working but captures only 1 values at a time i.e. Count not the status

    /* Expected Code

    if (status == true)  // where status and count is returned from retrieveData method
    {
        count = retrieveData();
        System.out.println("Status is true so can proceed");
    }

    else
        System.out.println("Status is not true so don't proceed");
    */
}





public static int retrieveData() throws  Exception 
    {

        boolean success = false;
        String query = "SELECT Count(1) FROM Account";
        int totalCount=0;
        ResultSet rsRetrieve = null;
            Statement stmt = null;
            stmt = conn.createStatement();
            rsRetrieve = stmt.executeQuery(query);
            while (rsRetrieve.next())
            {
                totalCount= rsRetrieve.getInt(1);
                System.out.println("totalCount : "+totalCount);
            }


        success = true;
        return totalCount; // current working code but returns only 1 value i.e. Count not status

        /*   Expected

        return success + totalCount

        */
    }

Ответы [ 5 ]

2 голосов
/ 30 апреля 2019

Существуют различные способы перенастройки множественных значений из метода, некоторые из лучших подходов, которые я использую:

1- Создайте класс для типов данных, которые вы хотите вернуть, например, вы хотите вернуть две строки. Сделайте класс следующим образом:

public class myType {
            String a;
            String b;

            public String getA() {
                return a;
            }

            public void setA(String _a) {
                a = _a;
            }
            //And All other geter setters
        }

и сделайте тип возврата вашего метода вышеупомянутым классом.

2- Карта возврата с парами ключ-значение
3. Создайте интерфейс и вызовите метод Abstract, откуда вы хотите вернуть значения (вы должны реализовать интерфейс в классе, в который хотите получить значения) Надеюсь, что это даст вам грубую идею двигаться вперёд

2 голосов
/ 30 апреля 2019

Вы можете создать пользовательский объект Java следующим образом

public class Result {

   private boolean success;
   private int totalResults;

   public Result(boolean success, int totalResults){
    this.success = success;
    this.totalResults = totalResults;
   }
   public boolean getSuccess(){
     return this.success;
   }

   public boolean getTotalResults(){
       return this.totalResults;
   }

}
0 голосов
/ 30 апреля 2019

Вы можете использовать Java Pair

import javafx.util.Pair;

public Pair retrieveData(int a, int b) {
   return new Pair(a, b);
}

Pair p = retrieveData(1,2);
int a = p.getKey();     // 1
int b = p.getValue();   // 2
0 голосов
/ 30 апреля 2019

Вы не можете, но можете создать класс компонента для хранения нескольких объектов.

Если это для программной обработки ошибок, вы можете взглянуть на Optional (стандартный) или Either (vavr) для обработки нескольких результатов

0 голосов
/ 30 апреля 2019

Я рекомендую придерживаться вашего текущего общего подхода, а не , пытаясь вернуть две части информации из вашего метода.Ваша сигнатура метода генерирует исключение, и один из возможных способов справиться с этим - заставить ваш метод генерировать исключение, когда что-то идет не так.В противном случае это означает, что запрос на подсчет выполнен, и будет возвращено некоторое количество.Но, вероятно, у вас должен быть блок try catch, окружающий ваш код JDBC:

public static int retrieveData(Connection conn) throws Exception {
    Statement stmt = null;
    int totalCount = 0;

    try {
        String query = "SELECT COUNT(*) FROM Account";

        ResultSet rsRetrieve;
        stmt = conn.createStatement();
        rsRetrieve = stmt.executeQuery(query);

        if (rsRetrieve.next()) {
            totalCount = rsRetrieve.getInt(1);
            System.out.println("totalCount : " + totalCount);
        }
    }
    catch (SQLException e) {
        System.out.println(e.getMessage());
        threw new Exception("something went wrong");
    }
    finally {
        if (stmt != null) {
            stmt.close();
        }

        if (conn != null) {
            conn.close();
        }

    }

    return totalCount;
}

Таким образом, здесь используется следующий шаблон: если что-то пойдет не так, счетчик не будет, и вызывающая сторона получит исключение.В противном случае, если исключение не произойдет, будет возвращено некоторое количество.

...