Страницы

Поиск по вопросам

пятница, 26 апреля 2019 г.

Как создать массив хранящий переменные разных типов?

Добрый день! Есть ли способ в Java создать массив, в котором будут хранится переменные разных типов? И если такой способ есть, опишите пожалуйста способ реализации.


Ответ

Можно, но, скорее всего, не стоит.
Простой ответ: для таких целей можно использовать массив Object. Т.к. Object — базовый тип, в массив можно будет засунуть что угодно. Пример метода:
Object[] getValues() { Object[] result = new Object[3]; result[0] = "name"; result[1] = 2; result[2] = new File("file.txt"); return result; }
Проблема такого подхода в том, что вызывающему методу понадобится обрабатывать элементы массива по отдельности, а для этого вызывающие метод должен знать порядок элементов, их типы и количество:
Object[] values = getValues(); int count = (Integer) values[0]; String name = (String) values[1]; File doc = (File) values[2];
Программисту придется держать в голове последовательность элементов, писать длинные комментарии, но все равно избежать ошибок будет сложно. Например, в коде выше перепутаны индексы числа (count) и строки (name). Из-за этого при исполнении код выбросит исключение. Такую ошибку сложно заметить при написании кода. Еще сложнее отследить подобные ошибки если набор элементов будет изменяться.
По этим причинам массивы базового типа используются тогда и только тогда, когда нельзя точно определить типы элементов при написании кода (например, Set.toArray).
Альтернатива — класс-результат.
Если нужно вернуть несколько значений из метода, то можно создать класс для результата метода. Значения будут полями этого класса. Например, класс для метода выше:
class MethodResult { private final String name; private final int count; private final File document;
MethodResult(String name, int count, File document) { this.name = name; this.count = count; this.document = document; }
String getName() {return name;} int getCount() {return count;} File getDocument() {return count;} }
Метод, который его возвращает:
MethodResult getValues() { return new MethodResult("name", 2, new File("file.txt")); }
При таком подходе результат метода сохранит информацию о типах и наименованиях полей, к полям результата можно обращаться напрямую:
MethodResult result = getValues(); int count = result.getCount(); String name = result.getName(); File doc = result.getDocument();
Скорее всего, результат метода имеет какое-то значение в ходе работы программы и классу MethodResult можно дать какое-то осмысленное название, соответствующее задаче. Если сложно сказать какое значение имеет результат метода, то стоит рассмотреть возможность разбить метода на несколько более ясных.

Комментариев нет:

Отправить комментарий