Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Возвращение целого из метода через параметр


Автор: _Владимир_ 17.11.2011, 11:10
Здравствуйте, Все!

Подскажите как вернуть параметр из метода? Например, так:

Код


class Divider
{
  public int Div(int numerator, int denominator, ref int remainder)
  {
     remainder=numerator%denominator;
     return numerator/denominator;
  }
}

class ZZZ
{
   public void SuperMethod()
   {
      int A=10;//Делимое
      int B=3;//Делитель
      int C;//Остаток

      Divider divider=new Divider();
      int C=divider.Div(A, B, C);
      ...
   }
}


Хочу возвращать именно через параметр и именно целое. Возвращать классы не предлагать smile 

Почему-то так не работает:
Код

public int Div(int numerator, int denominator, Integer remainder)


Спасибо

Автор: Stolzen 17.11.2011, 11:16
ref и out в джаве не работают - все параметры передаются по значению.

Автор: math64 17.11.2011, 12:19
Код

class Divider
{
  public int div(int numerator, int denominator, int[] remainder)
  {
     if (remainder != null && remainder.length >= 1)
       remainder[0]=numerator%denominator;
     return numerator/denominator;
  }
}
class ZZZ
{
   public void SuperMethod()
   {
      int A=10;//Делимое
      int B=3;//Делитель
      int C;//Частное
      int R; //Остаток
      {
        Divider divider=new Divider();
        int[] rem = new int[1];
        C=divider.div(A, B, rem);
        R = rem[0]; //Остаток
      }
      ...
   }
}

лучшего не придумать, если не хочешь классы или интерфейсы.

Добавлено через 3 минуты и 48 секунд
PS: Integer не даботает потму, что это неизменяемый объект, как и String. Можешь сделять свой класс MyInteger, значение которого можно менять - но int[1] его полный эквивалент.

Автор: _Владимир_ 17.11.2011, 13:41
Цитата

PS: Integer не даботает потму, что это неизменяемый объект, как и String. Можешь сделять свой класс MyInteger, значение которого можно менять - но int[1] его полный эквивалент. 

Отлично - это и есть решение:
Код

int Div(int A, int B, int [] C){ ... }

Спасибо!

Автор: Stolzen 17.11.2011, 15:14
Цитата(_Владимир_ @  17.11.2011,  14:41 Найти цитируемый пост)
Отлично - это и есть решение:
int Div(int A, int B, int [] C){ ... }
Спасибо!


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

Автор: math64 17.11.2011, 17:31
Цитата(Stolzen @  17.11.2011,  15:14 Найти цитируемый пост)
Это, может быть и есть решение, однако я бы не рекомендовал так делать.Сейчас работаю с кодом, в котором таким образом возвращаются данные - все очень неочевидно и запутанно. Сделайте лучше класс.

Я то же - кроме случая, когда програмируется маленький апплет и хочется чтобы всё было в одном классе, чтобы не создавать jar.
Но вместо класса лучше создать интерфейс:
Код

interface Remainder {
int getRemainder();
void setRemainder(int rem);
}
class Divider
{
  public int div(int numerator, int denominator, Remainder remainder)
  {
     if (remainder != null)
       remainder.setRemainder(numerator%denominator);
     return numerator/denominator;
  }
}
class ZZZ implements Remainder
{
   private int remainder;
   public int getRemainder() { return remainder; }
   public void setRemainder(int rem) { remainder = rem; }
   public void SuperMethod()
   {
      int A=10;//Делимое
      int B=3;//Делитель
      int C;//Частное
      int R; //Остаток
      Divider divider=new Divider();
      C=divider.div(A, B, this);
      R = getRemainder(); //Остаток
      ...
   }
}

ещё вариант:
Код

interface Remainder {
int getRemainder();
void setRemainder(int rem);
}
class Divider implements Remainder
{
  private int remainder;
  public int getRemainder() { return remainder; }
  public void setRemainder(int rem) { remainder = rem; }
  public int div(int numerator, int denominator, Remainder remainder = null)
  {
     if (remainder == null) rmainder = this;
     remainder.setRemainder(numerator%denominator);
     return numerator/denominator;
  }
}
class ZZZ
{
   public void SuperMethod()
   {
      int A=10;//Делимое
      int B=3;//Делитель
      int C;//Частное
      int R; //Остаток
      Divider divider=new Divider();
      C = divider.div(A, B);
      R = divider.getRemainder(); //Остаток
      ...
   }
}


Автор: Stolzen 17.11.2011, 17:44
Почему бы не сделать так? 

Код

  public int div(int numerator, int denominator)
  {
     return numerator / denominator;
  }

  public int mod(int numerator, int denominator)
  {
     return numerator % denominator;
  }

Автор: math64 17.11.2011, 18:17
Цитата(Stolzen @  17.11.2011,  17:44 Найти цитируемый пост)
Почему бы не сделать так?

полагаю, это просто пример. Реальный случай где ТС хочет вернуть значение через параметр, сложнее, и полагаю, не разлагается на несколько более простых вычислений, которые можно вызвать отдельно. Если это так, то действительно, стоит разделить, чтобы возвращался один результат - при использовании функций с побочным эффектом часто этот побочный эффект забывается.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)