Ответ 1
Невозможно передать примитив напрямую по ссылке на Java.
Обходной путь заключается в том, чтобы вместо этого передать ссылку на экземпляр класса-оболочки, который затем содержит примитив в качестве поля-члена. Такой класс обертки может быть предельно простым для себя:
public class IntRef { public int value; }
Но как насчет некоторых предварительно построенных классов-оболочек, поэтому нам не нужно писать самостоятельно? OK:
Apache commons-lang Mutable * classes:
Преимущества: Хорошая производительность для однопоточного использования. Полнота.
Недостатки: вводит стороннюю библиотечную зависимость. Нет встроенных элементов управления concurrency.
Репрезентативные классы: MutableBoolean, MutableByte, MutableDouble, MutableFloat, MutableInt, MutableLong, MutableObject, MutableShort.
java.util.concurrent.atomic Атомные * классы:
Преимущества: часть стандартного API Java (1.5+). Встроенные элементы управления concurrency.
Недостатки: малая производительность при использовании в однопоточной настройке. Отсутствует прямая поддержка некоторых типов данных, например. нет AtomicShort.
Репрезентативные классы: AtomicBoolean, AtomicInteger, AtomicLong и AtomicReference.
Примечание. Как показывает пользователь ColinD в своем ответе, AtomicReference может использоваться для аппроксимации некоторых из отсутствующих классов, например. AtomicShort.
массив примитивов длины 1
Ответ OscarRyz демонстрирует использование массива длиной 1 для "обертывания" примитивного значения.
Преимущества: Быстрая запись. Производительный. Не требуется сторонняя библиотека.
Недостатки: Немного грязные. Нет встроенных элементов управления concurrency. Результаты в коде, который не делает (явно) самодокумент: есть ли массив в сигнатуре метода, чтобы я мог передавать несколько значений? Или это здесь как подмостки для эмуляции перекрестных ссылок?
Также см.
Ответы на вопрос StackOverflow "Mutable boolean field в Java.
Мое мнение
В Java вы должны стремиться использовать вышеупомянутые подходы экономно или совсем не. В C обычно используется возвращаемое значение функции для передачи кода состояния (SUCCESS/FAILURE), в то время как фактический выход функции ретранслируется через один или несколько параметров out. В Java лучше использовать Исключения вместо кодов возврата. Это освобождает значения возвращаемого метода метода, которые будут использоваться для переноса фактического вывода метода - шаблон проектирования, который большинство программистов Java считают более естественным, чем out-parameters.