从对象中获取列表,一行修改和设置

Get list from object, modify and set in one line

我需要从对象中获取List<Example>,向其添加一个元素,并将修改后的列表附加到对象。有没有一种明智的方法可以在一行中做到这一点?现在它看起来像下面这样:

List<Example> examples = user.getExamples();
examples.add(example);
user.setExamples(examples);

我是这样想的:

user.setExamples(user.getExamples().add(example));

但由于这个原因它不起作用 add returns true

如果您真的想在一行中使用它,那么这是一种可能适合您要求的方法。:

 user.getExamples().add(example);

object-oriented programming 中,您应该从要求对象“做它的事情”的角度来思考,而不是试图从外部操纵它的内部结构。

因此,与其提取、操作和 re-inject,不如简单地要求该对象添加一个项目。您甚至不知道该对象中是否有 列表。让对象在它认为合适的时候负责跟踪项目。

user.addExample( myExample ) ;

换句话说,有 getter 和 setter 通常是 object-oriented 设计不佳的标志。

如果坚持要外部修改:

  • 如果您确定由 getter 编辑的列表 return 是 (a) 在对象中维护的相同列表(通常是糟糕的设计)并且 (b) 是可修改的,那么您可以在 getter 编辑的对象 return 上使用 where you call List#add 中看到的方法。我会添加一个 if 测试来验证你回来了 true,因为 false 意味着添加失败。
  • 如果您想将修改后的列表传递给 setter 方法,那么正如您所见,您不能在一行中这样做,因为方法 return 是布尔值。对于 fluent-style syntax,您需要一个添加方法,该方法 return 引用了列表本身。

要使用 setter,您必须进行多次声明。

List< Example > list = user.getExamples() ;
if( list.add( myExample ) ) 
{
    user.setExamples( list ) ;
} else 
{
    … handle failure …
}

如果 returned 列表不可修改,您将需要创建一个新列表。将不可修改的列表传递给构造函数。

List< Example > list = new ArrayList<>( user.getExamples() ) ;
if( list.add( myExample ) ) 
{
    user.setExamples( list ) ;
} else 
{
    … handle failure …
}