Можно ли изменить значение атрибута, переданного в аргументе функции в Java? - PullRequest
0 голосов
/ 01 августа 2020

Я работаю над калькулятором и ищу, как мне оптимизировать свой код. Дело в том, что у меня много дублирования кода из-за того, работаю ли я над первым числом расчета или вторым. Итак, я ищу, можно ли изменить значение атрибута, отправленного в аргументе функции? (Думаю, не потому, что нигде не видел ответа). Возможно, я плохо выражаюсь, поэтому вот код ниже, чтобы объяснить, о чем я говорю:

public class MyClass
{
    private static int number1 = 1;
    private static int number2 = 2;

    public MyClass()
    {
        changeValueOf(number1, 3);
    }

    private static void changeValueOf(int number, int value)
    {
        //Change here the value of the correct field
    }

}

Ответы [ 2 ]

2 голосов
/ 01 августа 2020

Прежде всего, вы можете изменить статические c переменные внутри метода:

private static void changeValueOf(int value)
{
    number1 = value;
}

Но я думаю, это не то, что вы ищете:)

In Java (и в большинстве других языков) примитивный тип данных (int, short, long, и c), передаваемый по значению, например, копия значения передается методу (функции). И ссылочные типы (объекты, например, созданные с помощью оператора new) передаются по ссылке. Итак, когда вы изменяете значение ссылочного типа (объекта), вы можете видеть изменения во внешних областях (например, в вызывающем методе).

Итак, ответ отрицательный - вы не можете изменить значение int, чтобы внешняя область видела обновленное значение.

Однако вы можете обернуть свои значения int некоторым объектом - и это изменит значение внутри него:

public class Example {
    public static void main(String[] args) {
        Example app = new Example();

        // Could be static as well
        Holder val1 = new Holder(1);
        Holder val2 = new Holder(2);

        app.changeValue(val1, 7);

        System.out.println(val1.value); // 7
    }

    public void changeValue(Holder holder, int newValue) {
        holder.value = newValue;
    }

    static class Holder {
        int value;
        Holder(int value) {
            this.value = value;
        }
    }
}

Кроме того, вы можете создать массив с двумя значениями и обновить их внутри метода, но это не очень хороший подход IMO

И, наконец, вы можете просто вернуть обновленное значение и присвоить его своим переменным:

public class Example {
    private static int number1 = 2;
    private static int number2 = 3;

    public static void main(String[] args) {
        Example app = new Example();
        
        number1 = app.mul(number1, 7);
        number2 = app.mul(number2, 7);

        System.out.println(number1); // 14
        System.out.println(number2); // 21
    }

    public int mul(int a, int b) {
        return a * b;
    }

}
1 голос
/ 01 августа 2020

Одна из возможностей - использовать массив для хранения ваших переменных вместо отдельных переменных с добавленными числами. Тогда вы могли бы написать, например, number[1] вместо number1. Вы можете передать массив индекс число, чтобы указать, на какую переменную вы ссылаетесь.

public class MyClass
{
    private static int[] variables = {1, 2};

    public MyClass()
    {
        // change value of first variable
        changeValueOf(0, 3);

        // now variable[0] = 3
    }

    private static void changeValueOf(int number, int value)
    {
        variables[number] = value;
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...