【问题标题】:How to modify a passed in value and return it from a java method如何修改传入的值并从java方法返回它
【发布时间】:2021-02-04 12:22:08
【问题描述】:

我正在尝试修改传入的对象并返回它:

private Sample modifyObj(Sample obj) {
  obj.setValue1("value1");
  obj.setValue2("value2");
  return obj;
}

这给了我一个错误,说“方法修改了参数”。 我试图通过在方法中也有一个本地副本来做到这一点:

    private Sample modifyObj(Sample obj) {
      Sample obj2 = obj;
      obj2.setValue1("value1");
      obj2.setValue2("value2");
      return obj2;
    }

但仍然是同样的错误。有没有更好的办法?

【问题讨论】:

  • 添加您的实际“示例”类文件的图片。
  • 可以粘贴你的全部代码吗?
  • 另外,在什么环境下会出现这个错误?一些在线工具,还是本地 IDE?这不是我知道的任何 java 编译器的标准错误,可能是一些额外的静态分析器。疯狂的猜测:分析器可能会因为您既修改并返回参数而感到困惑。这一般来说并不算太不寻常,但也许你的工具链中的某些东西正试图强制执行一些特殊的样式指南?
  • 如果将您的方法设为静态和/或删除 return 语句会改变有关此错误消息的任何内容,您可以尝试。
  • 请注意,返回值不是必需的,因为您返回作为参数收到的相同对象(在两种情况下),并且调用者已经拥有它。

标签: java object deep-copy


【解决方案1】:

理想情况下,当您将object 传递给method 时,它的引用会被传递,并且在此之上所做的所有修改都会自动应用于调用者中传递的object。所以我想除非你想克隆,否则不需要返回它。

private void modifyObj(Sample obj) {
  obj.setValue1("value1");
  obj.setValue2("value2");
}

在调用者处

Sample sample = new Sample();
modifyObj(sample);
//here when you access sample, you will get modified values anyways

【讨论】:

    【解决方案2】:

    我试图重现您的错误,创建了一个示例类:

    public class Sample {
    
        private String s1, s2;
    
        public void setValue1(String s1) {
            this.s1 = s1;
        }
    
        public void setValue2(String s2) {
            this.s2 = s2;
        }
    }
    

    并使用像您这样的方法进行测试

    public class proofSemantic {
    
        private Sample modifyObj(Sample obj) {
            obj.setValue1("value1");
            obj.setValue2("value2");
            return obj;
        }
        public void makeTest() {
            Sample obj=new Sample();
            modifyObj(obj);
        }
        public static void main(String[] args) {
            proofSemantic proof=new proofSemantic();
            proof.makeTest();
        }
    }
    

    它不会产生错误。你可以再详细一点吗?顺便说一句,我不知道这个奇怪的错误。你用的是什么Java机器?什么IDE?

    【讨论】:

      猜你喜欢
      • 2011-06-29
      • 2012-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-19
      • 2014-02-28
      • 2023-03-29
      • 1970-01-01
      相关资源
      最近更新 更多