Java: возвращение двух ints из вызова метода

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

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

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

Считаете ли вы, что это уродливое, плохое или злое? Или ты тоже это делаешь?

3

6 ответы

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

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

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

12
добавлено

В этом случае вы можете использовать пункт .

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

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

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

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

3
добавлено

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

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

2
добавлено

Вы можете создать внутренний класс для хранения возвращаемых значений метода. Это имеет то преимущество, что не требуется новый .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.

1
добавлено

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

0
добавлено

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

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

0
добавлено
pro.jvm
pro.jvm
3 503 участник(ов)

Сообщество разработчиков Java Scala Kotlin Groovy Clojure Чат для нач-их: @javastart Наш сайт: projvm.com projvm.ru Наш канал: @proJVM Вакансии: @jvmjobs Конфы: @jvmconf

Java & Co
Java & Co
2 370 участник(ов)

Можно обсуждать с матом и без всё, что касается жабы, вплоть до холиваров. НЕ ИМЕЕТ ОТНОШЕНИЯ К САЙТУ JAVARUSH.RU ПРАВИЛА - https://t.me/javarush/75723 Вакансии сюда - https://telegram.me/joinchat/B7IzvUCnfo6d8t3yIxKguQ По вопросам - @thedude

learn.java
learn.java
1 888 участник(ов)

Чат для начинающих и не только Статистика: https://combot.org/chat/-1001083535868 Основной чат - @jvmchat

Java Underground
Java Underground
169 участник(ов)

https://vk.com/javatutorial

Javanese Questions
Javanese Questions
109 участник(ов)

Чат предназначен для обмена знаниями строго в формате в вопрос-ответ. Тема — Java, Kotlin и Android. Вопрос должен быть предварительно прогуглен, понятно и грамотно сформулирован, помечен хэштегами. Ответ — тем более. Куски кода размером в несколько строк можно писать прямо здесь, для больших кусков кода стоит использовать http://gist.github.com/, http://pastebin.com/, https://codeshare.io/ или любой аналогичный сервис. В некоторых случаях можно прикреплять скриншоты. Стикеры и гифки запрещены. Дополнять и уточнять вопросы и ответы — редактированием исходного сообщения. Обсуждения должны приводить к редактированию вопроса/ответа и удаляться. По хештегам можно искать существующие вопросы и овтеты: #вопрос #ответ #git #generics #java #server #awt #javafx #swing #kotlin #anko #tornadofx #ktor #android #recyclerView #performance #arch #network #permissions #storage #async