Лучшие практики для возврата нескольких значений? - PullRequest
0 голосов
/ 22 мая 2018

Допустим, я хочу разработать функцию, которая будет возвращать информацию о данной акции.Функция получает название акции в качестве параметра типа String, а затем возвращает несколько значений.Вот некоторые значения, которые он может вернуть:

int price
int profitability
double currentTrend
int mostRecentSpike
long timeOfRecentSpike

Как вы можете видеть, все они имеют различные примитивные типы.Мне интересно, что лучший способ вернуть эти значения с точки зрения оптимизации.Поэтому, если бы я создал собственный объект, подобный так:

class Stock {
    int price;
    int profitability;
    double currentTrend;
    int mostRecentSpike;
    long timeOfRecentSpike;
    public Stock(int price, int profitability, double currentTrend, int mostRecentSpike, long timeOfRecentSpike) {
        this.price = price;
        this.profitability = profitability;
        this.currentTrend = currentTrend;
        this.mostRecentSpike = mostRecentSpike;
        this.timeOfRecentSpike = timeOfRecentSpike;
    }
}

и вернул его, было бы лучше, чем альтернатива, где я просто вернул бы это:

new Object[] {price, profitability, currentTrend, mostRecentSpike, timeOfRecentSpike}

и затем произвелвсе в соответствующие примитивные типы?Хотя я понимаю, что читаемость будет снижаться при возврате и приведении объекта [], в основном меня интересует производительность с точки зрения ЦП, памяти и сериализации.

  • Что будет больше ЦПинтенсивный?
  • Что потребует больше памяти?
  • Что лучше всего сочетать с сериализацией?

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

Ответы [ 3 ]

0 голосов
/ 22 мая 2018

В то время как вы говорите

, это увеличится, чтобы быть гораздо более значимым в моей реальной ситуации.

Я подозреваю, что у вас на самом деле нет цифр, чтобы доказать, что(как будто у вас есть, я сомневаюсь, что вы спросите здесь ...)

Я бы посоветовал вам написать это наиболее ясным способом, который, вероятно, предполагает передачу ссылки на реальный объект, покау вас на самом деле есть цифры, чтобы доказать , что это настоящая проблема.(99% времени, «очевидное» сокращение времени не так)

0 голосов
/ 22 мая 2018

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

маркировочное пространство:

Поскольку массивы являются объектамив Java они будут иметь структуру, аналогичную пользовательскому классу Stock, и в результате потребуют, по существу, того же объема памяти и ресурсов ЦП.

Пользовательский класс имеет преимущество с точки зрения сериализации, поскольку он имеетфиксированный идентификатор сериализации, который также может быть настроен при желании.

Пользовательский класс также улучшает читабельность.

Энди Тернер:

с объектом [] каждое введенное значение станет объектом, и когда вы извлекаете элементы из этого массива, вам нужно поместить их из объекта в не примитивный аналог (Long, Double, Integer), который имеет некоторые накладные расходы.С пользовательским классом вы будете хранить все как примитив, поэтому нет необходимости в боксе и, как следствие, никаких накладных расходов.

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

0 голосов
/ 22 мая 2018

Ну с точки зрения оптимизации рекомендуется возвращать объект Stock, потому что приведение приведет к гораздо большему использованию процессора и памяти и даже может привести к исключениям, таким как classCastException, если в любом случае вы пропустите какие-либо переменные.

Итак,

return new Stock(price, profitability, currentTrend, mostRecentSpike, timeOfRecentSpike);
...