Java: найкращий спосіб передавати int за посиланням


84

У мене є функція синтаксичного аналізу, яка аналізує закодовану довжину з байтового буфера, вона повертає аналізовану довжину як int і приймає індекс у буфер як цілочисельний аргумент. Я хочу, щоб функція оновлювала індекс відповідно до того, що вона проаналізувала, тобто хочу передавати цей індекс за посиланням. У C я просто пройшов би int *. Який найчистіший спосіб зробити це на Java? В даний час я розглядаю передачу аргументу індексу. як int[], але це трохи потворно.


13
Integerє незмінним.
Юваль Адам

1
Якщо ви хочете уникнути бібліотеки apache, ви можете передати int і повернути оновлене значення. Якщо це два значення, я рекомендую використовувати Point як контейнер. В іншому випадку опція масиву або одна з інших пропозицій тут добре.
EntangledLoops

Ви повинні повернути int або об'єкт; Якщо вам дійсно потрібно більше одного, можливо, вам слід переглянути свій дизайн "занять"
Уджвал Сингх,

Відповіді:


72

Ви можете спробувати скористатися org.apache.commons.lang.mutable.MutableIntз бібліотеки Apache Commons. У самій мові немає прямого способу зробити це.


24

Це неможливо на Java. Як ви запропонували, один із способів - пройти int[]. Іншим було б мати невеликий клас, наприклад, IntHolderякий обгорнув int.


20

Ви не можете передавати аргументи за посиланням на Java.

Що ви можете зробити, це обернути своє ціле значення у змінний об’єкт. Використання Apache Commons MutableInt- хороший варіант. Інший, трохи більш затуманений спосіб - це використовувати int[]подібний, який ви запропонували. Я б не використовував його, оскільки незрозуміло, чому ви загортаєте intв одноклітинний масив.

Зверніть увагу, що java.lang.Integerце незмінно.


А як щодо використання AtomicInteger? Це змінюється та передається через посилання? (Afaik AtomicReference <Boolean> робить це правильно).
icbytes


14

Оберніть байт-буфер та індекс у об’єкт ByteBuffer . ByteBuffer інкапсулює концепцію позиції буфер + і дозволяє читати та писати з проіндексованої позиції, яку він оновлює під час руху.


6
Точно так. Не змушуйте Java робити це по-своєму, робіть це по-Java. Java - це не C. Спроби змусити її поводитися так, як C завжди будуть потворними хаками.
Skip Head

9

Ви можете створити новий клас таким чином:

public class Inte{
       public int x=0;
}

пізніше ви можете створити об'єкт цього класу:

Inte inte=new Inte();

тоді ви можете передати inteяк аргумент туди, куди ви хочете передати цілу змінну:

public void function(Inte inte) {
some code
}

так для оновлення цілочисельного значення:

inte.x=value;

для отримання значення:

Variable=inte.x;

8

Ви можете створити довідковий клас для обтікання примітивів:

public class Ref<T>
{
    public T Value;

    public Ref(T value)
    {
        Value = value;
    }
}

Тоді ви можете створити функції, які приймають посилання як параметри:

public class Utils
{
    public static <T> void Swap(Ref<T> t1, Ref<T> t2)
    {
        T temp = t1.Value;
        t1.Value = t2.Value;
        t2.Value = temp;
    }
}

Використання:

Ref<Integer> x = 2;
Ref<Integer> y = 9;
Utils.Swap(x, y);

System.out.println("x is now equal to " + x.Value + " and y is now equal to " + y.Value";
// Will print: x is now equal to 9 and y is now equal to 2

Сподіваюся, це допомагає.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.