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