【问题标题】:Updating original values after passing them as params to a new method instead of references在将原始值作为参数传递给新方法而不是引用后更新它们
【发布时间】:2020-03-31 14:08:17
【问题描述】:

我有一个方法,它的某些部分是重复的。我设法以原始方法多次使用较小方法的方式拆分代码。问题是,当我将一些值作为参数传递给那些新的较小方法并使用它们时,原始值不会得到更新。我所做的操作是:值递增或从 arraylist 中删除项目。如何使用较小的方法更新原始值,而不仅仅是引用?我想出的唯一可能的解决方案是创建一个新类,我可以在其中为这些值设置一个设置器并更新它们。但是有没有更简单/直接的方法来解决它?

部分main方法:

int numberOfBlocks = 0;
int currentBlock = 0;
int currentTime = 0;

ArrayList<Request> queue = new ArrayList<Request>();

if(queue.size != 0) {
    updateStatus(queue, currentBlock, numberOfBlocks);
}

if(something else happens) {
    removeFinished(queue, currentBlock);
}

较小的方法:

private void updateStatus(ArrayList<Request> queue, int currentBlock, int numberOfBlocks) {
        if (queue.get(0).getBlock() > currentBlock)
            currentBlock++;
        else
            currentBlock--;

        numberOfBlocks++;
    }

private void removeFinished(ArrayList<Request> queue, int currentBlock){
        if (queue.get(0).getBlock() == currentBlock) {      
            queue.remove(0);
        }
    }

【问题讨论】:

    标签: java pass-by-reference


    【解决方案1】:

    首先,如果您传递一个参数以便在方法中更改它,您的方法应该返回更改后的值,这将解决您的问题。如果需要更改多个值,那么您是正确的,原语被传递了 y 值并且调用方法看不到调用方法中所做的更改。所以你应该像你想要的那样将这些值封装在一个带有 setter 和 getter 的包装类中。仅此一项就可以解决您的问题。但是,您的方法返回该类也是有意义的,因为它已被修改。这只是一个很好的阶梯

    【讨论】:

    • 谢谢 - 如果我不想为它创建那个新类,有可能实现吗?还是我应该只坚持基于类的解决方案?
    • 如果它只是一个值,那么您的方法应该返回更新后的值。这将解决问题
    • 在一种情况下没问题,但在我的第二种方法中,我需要增加两个值,所以在这里返回不起作用。
    • 所以,就像我说的那样,创建一个类,该类将使用 setter 和 getter 保存这两个属性,将其作为参数传递,更新并返回它。
    【解决方案2】:

    如果较小的方法与主方法在同一个类中,则不要将它们作为参数传递,这些方法将使用类的字段。这是非线程安全的,但无论如何你的类已经是非线程安全的了。

    class MyClass
    {
        int numberOfBlocks = 0;
        int currentBlock = 0;
        int currentTime = 0;
    
        ArrayList<Request> queue = new ArrayList<Request>();
    
        void myMainMethod() {
            if(queue.size != 0) {
                updateStatus();
            }
    
            if(something else happens) {
                removeFinished();
            }
        }
    
        private void updateStatus() {
            if (queue.get(0).getBlock() > currentBlock)
                currentBlock++;
            else
                currentBlock--;
    
            numberOfBlocks++;
        }
    
        private void removeFinished() {
            if (queue.get(0).getBlock() == currentBlock) {      
                queue.remove(0);
            }
        }
    
    

    【讨论】:

    • 我有更多类似于我上面展示的方法,它们使用相同的原语,如numberOfBlocks,但值不同,所以我必须创建许多字段,每个字段用于一种方法跨度>
    • 然后就像建议的那样,当方法更新一个值时返回它,当它更新多个值时返回一个包含所有更新值的类。
    猜你喜欢
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    • 2021-06-11
    • 2013-07-11
    • 2016-03-30
    • 2013-01-25
    • 2022-11-25
    • 2016-12-31
    相关资源
    最近更新 更多