加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 返回不可变列表

发布时间:2020-12-15 02:31:48 所属栏目:Java 来源:网络整理
导读:我正在创建一个名为Question的课程.这个类有答案,所以我希望能够返回附加到它的答案列表. 但是,如果用户对答案进行了更改,我希望用户调用更新方法,以便我可以进行其他验证等.现在,如果用户获得答案列表,他仍然可以通过说问题更改答案. ().get(0).setDescript
我正在创建一个名为Question的课程.这个类有答案,所以我希望能够返回附加到它的答案列表.

但是,如果用户对答案进行了更改,我希望用户调用更新方法,以便我可以进行其他验证等.现在,如果用户获得答案列表,他仍然可以通过说问题更改答案. ().get(0).setDescription(“BLAH BLAH”).

所以我想回复每个答案的副本,让用户改变这个,他必须将它合并/更新回问题.通过这种方法,我可以确保答案是有效的,但答案的equals方法是基于描述和正确的字段而不是id字段,因为我使用JPA.如果用户使用此方法更改答案,则更新方法将找不到答案,因为说明字段已更改且不再相等,因此在列表中找不到它.

有什么建议吗?

public void updateAnswer(Answer answer) {
    int index = answers.indexOf(answer);
    answers.set(index,answer);
}

public List<Answer> getAnswers() {
    return Collections.unmodifiableList(answers);
}


@Test
public void shouldUpdateAnswerInQuestion() {
    // Get first answer,make an update on the description
    // and then update answer on question.
    Answer answerThatWillBeUpdated = question.getAnswers().get(0);
    String updatedAnswerDescription = "Hey,it is now updated!";
    answerThatWillBeUpdated.setDescription(updatedAnswerDescription);
    question.updateAnswer(answerThatWillBeUpdated);

    // After updating check that the answer in the list is equal
    // to the answer updated.
    Answer answerFromList = question.getAnswers().get(0);

    assertEquals(answerThatWillBeUpdated,answerFromList);
}

答案类:

public class Answer {

    private long id;
    private String description;
    private Boolean correct;
    ...
}

解决方法

您应该重新考虑您的应用程序设计,但由于我不确定您的域限制是什么,我不能建议稍微重新设计或任何类型.

一个简单明了的答案是:程序到界面,而不是实现.如果要在修改setter之后强制调用update方法,请考虑使用Decorator模式.

>创建一个界面
>让你的具体类实现这个接口(答案)
>添加一个具体的类(选择一个更好的名称但是AnswerDecorator),它实现了接受上面提到的类的构造函数中的具体类的接口

然后,您只需将所有方法委托给内部实例,并将要调用的方法委托给update,请执行以下操作:

public void setField(int a){???innerInstance.setField(一);???更新(…);}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读