Java: возвращение двух целых из вызова метода - PullRequest
3 голосов
/ 27 октября 2011

Я часто это делаю в своем коде, который работает с множеством двухмерных координат:

int[] getSize() {
    int[] res = {gridRows, gridColumns};
    return res;
}

Я знаю, что могу определить крошечный класс и получить безопасность типов, но у меня нет, потому что это раздражаетчтобы у меня был такой тривиальный класс в его собственном маленьком тривиальном файле .java, который я должен включить в свой код.

Как вы думаете, это уродливо, плохо или плохо?Или ты тоже это делаешь?

Ответы [ 6 ]

12 голосов
/ 27 октября 2011

Если в вашем проекте есть концепция, которую вы хотите инкапсулировать, например, что эти два целых числа являются координатами, нет ничего плохого в том, чтобы иметь класс для них.На мой взгляд, это намного чище, чем заставлять всех создавать массив и т. Д.

Например, кто-то еще разрабатывает в том же проекте и вызывает ваш метод, как вы думаете, будет ли им понятнее получить int?массив с двумя позициями или объект с именем Coordinates?

Кроме того, вы можете захотеть реализовать такие вещи, как сравнение координат, которые могут быть инкапсулированы в правильной ОО-форме, если вы используете класс.(Пожалуйста, не забудьте соблюдать Контракт объекта , если вы переопределите что-то вроде equals).

3 голосов
/ 27 октября 2011

В этом случае вы могли бы использовать Точка .

В общем, помимо эстетики, часто существует достаточно тривиальных вспомогательных методов, связанных с чем-то подобным, что имеет смысл создать классдля того, чтобы удержать их, а не разбросать всю эту логику.Иногда даже просто наличие хорошего toString () для отладки и ведения журнала является достаточной причиной.

Там, где важна очень высокая производительность, сделайте тривиальные вспомогательные методы с высоким трафиком финальными, чтобы их можно было встроить.

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

В некоторых случаях рассмотрите возможность возврата void и передачи некоторого объекта контекста с большей областью действия, для которого метод может установить возвращаемые значения.Это следует использовать с большой осторожностью - это может легко привести к ползучести муфты.

2 голосов
/ 27 октября 2011

вы можете определить его как вложенный статический класс

, не говоря уже о том, что этот класс позволит гораздо больше (например, определить операции с 2D-координатами в 1 месте, поместить их в набор (равноне работает так на массивах))

1 голос
/ 27 октября 2011

Вы можете создать внутренний класс для хранения возвращаемых значений метода.Преимущество этого в том, что новый файл .java не требуется:

public class Parent{
  public Size getSize() {
    return new Size(gridRows, gridColumns);
  }

  public static class Size{
    //...
  }
}

Parent parent = new Parent();
Parent.Size size = parent.getSize();

Определение класса как «статического» в основном означает, что он может обрабатываться так же, как обычный класс (за исключением того, что вы должны использовать Parent.Sizeвместо Size).Если класс не является «статическим», вы не можете создать его новый экземпляр, не имея экземпляра класса outter.

0 голосов
/ 27 октября 2011

Учитывая, что Java не может возвращать несколько значений из методов, вы делаете единственный выбор для возврата нескольких значений одного типа . Если значения относятся к разным типам, вам придется написать небольшой класс (своего рода объект-значение) для инкапсуляции возвращаемых значений.

Еще один, даже самый уродливый вариант - передавать массивы в качестве параметров и оставлять там возвращаемые значения - хак для имитации передачи по ссылке в Java. Очень обескуражен.

0 голосов
/ 27 октября 2011

К сожалению, в Java это действительно лучший способ вернуть несколько значений.Я обычно использую Массивы или Списки.Я не обязательно думаю, что это «плохая форма», по сути, создавать для него класс, но это не нужно.

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