Как преодолеть тот факт, что примитивы передаются по значению - PullRequest
4 голосов
/ 22 января 2010

У меня есть длинный кусок кода, который вычисляет два значения (doubles) для меня, я использую этот кусок кода в нескольких местах - чтобы придерживаться принципов СУХОГО, я должен реорганизовать этот бит кода в хороший тестируемый модуль метод. Однако я не могу сделать так, чтобы он возвращал два числа типа double, а числа типа double являются примитивными, поэтому их нельзя передавать по значению и манипулировать ими. Самый чистый способ сделать это - вернуть double[]. Кто-нибудь может придумать лучший способ?

Спасибо

Ответы [ 10 ]

12 голосов
/ 22 января 2010

Во-первых, все переменные передаются по значению в Java, а не только примитивам. Просто объекты могут быть изменяемыми. Это важно понимать. Например:

public void addHour(Date date) {
  date.setTime(date.getTime() + 3600 * 1000);
}

Дата передается по значению, но Date является изменяемой, поэтому ее можно изменить, но попробуйте сделать это:

public void addHour(Date date) {
  date = new Date(date.getTime() + 3600 * 1000);
}

и дата не изменится. Зачем? Потому что дата является ссылкой, но передается по значению.

Во-вторых, эти двойники как-то связаны друг с другом? Если это так, оберните их в классе, чем описывает это отношение, например:

public class Coordinate {
  private final double x;
  private final double y;

  public Coordinate(double x, double y) {
    this.x = x;
    this.y = y;
  }

  public double getX() { return x; }
  public double getY() { return y; }
}
4 голосов
/ 22 января 2010

Вы можете заключить их в класс для этой цели.

Вы также можете задать параметр double [] для метода, который их вычисляет и куда он будет помещать вычисленные значения. Это может быть довольно эффективным, поскольку код вызывающей стороны может повторно использовать этот массив для последовательных вызовов, если производительность важна. 1003 *

3 голосов
/ 22 января 2010
double[] arr = {val1, val2};
return arr

или используйте класс, подобный Pair, который инкапсулирует 2 значения ...

3 голосов
/ 22 января 2010

Класс (неизменяемый) с двумя double полями?Возможно, вам даже захочется добавить некоторые интересные методы в класс.

Другой способ - заставить метод принять объект обратного вызова.

2 голосов
/ 22 января 2010

У вас есть несколько вариантов:

  1. Вернуть массив
  2. Возврат List<double>
  3. Возвращает объект класса, который оборачивает ваши двойки

И, кстати, Java не передает объекты по ссылке. Он передает указатели на объекты по значению. http://javadude.com/articles/passbyvalue.htm

2 голосов
/ 22 января 2010

Создайте новый класс, который имеет два двойных свойства с геттерами, сеттерами и конструктором, если хотите (и равно и hashcode ...), и заставьте метод возвращать объект этого типа. Универсальный способ сделать это - класс Pair. Это распространенный шаблон, и вы должны найти фрагменты кода везде (например, в базе кода NetBeans).

2 голосов
/ 22 января 2010

Я скорее парень из C ++, но создание собственного объекта под названием Pair, который может содержать 2 двойки и может быть передан по ссылке, имеет смысл для меня.

2 голосов
/ 22 января 2010

Если эти два числа можно рассматривать как логическое сопряжение значений, то имеет смысл объединить их в простой объект?

1 голос
/ 22 января 2010

Двойной массив является наиболее очевидным ответом. Вы можете сделать это немного безопаснее, имея объект-оболочку, подобный этому:

  public class MyTwoDoubles {

       public MyTwoDoubles(double one, double two) { ... }

       public double getOne() { ... }

       public double getTwo() { ... }
  }
0 голосов
/ 22 января 2010

Вы можете скорее использовать классы Wrapper, которые имеют ссылочные типы Для каждого типа значения вы можете найти класс-оболочку. для вашего случая можно использовать java.lang.Double, надеюсь, это решит цель Но все же в качестве хорошего дизайна я предлагаю вам не изменять значение объекта внутри метода. Вместо этого рефакторинг кода таким образом, что вы вызываете его дважды и возвращаете два разных значения, затем присваиваете его оригиналу Рекомендуется изменять значение объекта внутри метода

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...