Почему Java был определен таким образом, что методы могут взять в качестве входа несколько параметров,
но может только возвратить отдельный объект (или пусто)?
Это делало язык так или иначе легче реализовать или использовать?
Вероятно, потому что так это делают языки C и C++, а синтаксис языка Java очень похож на эти языки (и, возможно, основан на них).
На самом деле, согласно этой статье, Гослинг начал с расширения компилятора C++, поэтому вполне логично, что он будет следовать во многом тому же синтаксису:
Чтобы сделать разработку более нейтральным к платформе процессом (и таким образом удовлетворить спрос потребительского рынка на гибкость процессора), Гослинг начал с расширения компилятора C++.
Я не знаю наверняка, но полагаю, что Java выполняется так же, как и любая другая среда выполнения на основе стека. Это означает, что передача элементов в качестве параметров в метод выполняется легко, просто помещая их в стек перед передачей управления методу. Возвращаемые значения, вероятно, обрабатываются в виртуальной машине, как это делают C и C ++ - возвращаемое значение всегда помещается в регистр, который по своей природе является однозначным.
Это не большая проблема, потому что с помощью дженериков возврат нескольких значений может быть обработан безопасным для типов способом путем возврата экземпляра чего-то вроде Tuple
, что в большинстве случаев это не слишком большая ноша.
Может быть, предполагалось, что несколько возвращаемых значений будут инкапсулированы в объект?
Я предполагаю, что это будет условием: это то, что делают / делают основные объектно-ориентированные языки, так что это то, что сделала Java. Однако официальный аргумент, вероятно, будет таким же, как и аргумент о закрытии - не включайте вещи, которые омрачают стандартный синтаксис для повседневных задач ненужными задачами. Или, может быть, они посчитали, что один метод должен возвращать набор связанных значений, которые должны / могут входить в объект. Или, может быть, они просто не думали об этом / у них было время (довольно стандартная плата за проезд для разработчиков).
В связи с этим я нашел обсуждение использования замыканий для имитации множественных возвратов: http://weblogs.java.net/blog/brucechapman/archive/2007/11/closures_and_mu. html