【问题标题】:How to avoid same reference of objects [duplicate]如何避免对象的相同引用[重复]
【发布时间】:2021-07-20 10:31:00
【问题描述】:

我有这个问题,我正在创建一个 Junit 测试,我想先用 setUp 方法做点什么。查看我的示例代码:

class ClassDaoImplTests {

    @Autowired
    private NamedParameterJdbcTemplate template;

    private Project modifiedProject;
    
    private Project origProject;
    
    List<Project> projList;

    @BeforeAll
    protected void setUp() {
        
        preserveOriginalProjectData();
        prepareProjectDataToUpdate();
    }

    public void preserveOriginalProjectData() {
        
        projList = getSortedProjectList();
        origProject = projList.get(0);
    }
    
    public void prepareProjectDataToUpdate() {
        
        modifiedProject = projList.get(0);
        modifiedProject.setProjName(modifiedProject.getProjName() + "_Edit");
    }

    public List<Project> getSortedProjectList() {

        String sql = "SELECT * FROM Table1 ORDER BY id ASC";
        return template.query(sql, new BeanPropertyRowMapper<Project>(Project.class));
    }

}

无论我对modifiedProject 做什么,它都会反映在origProject 对象以及列表中的对象上。即使我使用这种方法,结果也是一样的:

 protected void setUp() {
    
    projList = getSortedProjectList();
    origProject = projList.get(0);
    prepareProjectDataToUpdate();
} 

如何保留原始对象的数据? 我没有包含其他代码来最小化代码的大小。但只是陈述逻辑。 其实我想要tearDown()origProject 数据来恢复表中的值。

【问题讨论】:

  • 将 projList.element 作为值传递给 prepareProjectDataToUpdate 方法,或者在 prepareProjectDataToUpdate() 中为 Project 创建一个新变量
  • 谢谢@talex。这给了我一个关于如何使用克隆来获得单独副本的新想法。但是在这个阶段不允许更改模型。对于 Mohit Hurat 的建议,我尝试通过在 prepareProjectDataToUpdate(Project project) 中将其设为参数来传递它。但得到了相同的结果。不知道我是否得到你的建议,但谢谢。

标签: java spring-boot junit java-8 spring-jdbc


【解决方案1】:

re: 无论我对 modifiedProject 做什么,它都会反映在 origProject 对象以及列表中的对象。

这里只有一个对象。复制引用不会复制引用的对象。

之后:

  modifiedProject = projList.get(0);

那么 'modifiedProject' 指向的对象是 'projList' 的第一个元素,而不是它的副本。当然,“origProject”指向同一个对象。

如果您想要一个 Project 的副本,那么 Project 类需要提供一种制作副本的方法。


在您的特定情况下,您可以通过再次执行 SELECT 来回避该问题,从而产生一个单独的实例。我不完全确定这一点,不熟悉您使用的数据库类,但似乎它从一个 SQL 语句到下一个 SQL 语句都没有保留任何内容。当然,这会带来“排序列表中的第一个元素”可能与以前不同的风险,所以我不建议这样做。

【讨论】:

  • 我认为这将是我的工作。我在 prepareProjectDataToUpdate() 中再次执行了 SELECT,并在修改之前保留了原始数据。太感谢了。 @iggy
猜你喜欢
  • 1970-01-01
  • 2015-07-30
  • 1970-01-01
  • 2023-02-01
  • 2019-02-26
  • 1970-01-01
  • 2012-12-08
  • 2016-04-22
  • 1970-01-01
相关资源
最近更新 更多