2012-07-02 5 views
0

Я заинтересован в этом это C-код в Java:Что такое чистый способ изменения аргументов внутри функции в java?

// sets n's ith bit from right, i starts from 0 
void setBit(int* n, int i){ 
    *n = *n | (1 << i); 
} 

Однако, похоже, что Java не может передать адреса, так что бы некоторые чистые подходы?

Я думал о двух подходах, но мне было интересно, есть ли лучшие способы сделать это?

подход 1: с использованием массива

// sets n[0]'s ith bit from right, i starts from 0 
public void setBit(int[] n, int i){ 
    n[0] = n[0] | (1 << i); 
} 

подход 2: с использованием класса

private class Data{ 
    int value; 
} 

// sets d.value's ith bit from right, i starts from 0 
public void setBit(Data d, int i){ 
    d.value = d.value | (1 << i); 
} 
+1

«Мне было интересно, есть ли лучшие способы сделать это?» - нет. –

+0

спасибо Сэму, я даже не заметил эту особенность! – Popcorn

+0

Есть ли причина не использовать 'BitSet' для установки битов? –

ответ

8

Нет, нет лучшего способа сделать это ...

Если вы не хотели бы для этого используется традиционный способ Java, который составляет

d = setBit(d, i); 

public int setBit(int d, int i) { 
    return d | (1 << i); 
} 

Это все, что можно сказать на Java, что «изменение аргументов функции» - это почти по своей сути unclean. Чистым способом является поиск альтернативы модификации аргументов.

(Иногда это будет неизбежно, и в этом случае ваши обходные пути путь. Тем не менее, если вы хотите, чтобы написать метод modify(myData), это часто лучше, чтобы добавить метод modify() к myData «s класса.)

+1

Похоже, мы ответили * точно * то же самое в ту же минуту. Я удаляю свой ответ, потому что предпочитаю, чтобы ваша переменная называла «d» моим «n». До свидания 10 баллов * sniff *. – Joe

3

Как насчет int setBit(int n, int i), который возвращает новый int с заданным битом?

В качестве альтернативы, вы можете инкапсулировать это в классе под названием IntBuilder или что-то подобное:

IntBuilder ib = new IntBuilder(); 
ib.setBit(n); 
int i = ib.getInt(); 

Это только действительно имеет смысл, если вы были другие операции, которые вы также хотите выполнить. Для просто настройки немного, это слишком много.

0

Не общий подход, но в вашем конкретном случае я бы предложил использовать переменное целое число. Пакет Apache-Обще-lang3 содержит хорошую реализацию как org.apache.commons.lang3.mutable.MutableInt

http://commons.apache.org/lang/api-release/index.html

метод .setValue() позволит реализовать метод в несколько C-стиле пути.

ps: Мне не нравятся ответы, начинающиеся с Nope, no better way to do it.... (хотя иногда это действительно так ...)

Смежные вопросы