我正在做一些自然语言处理,因此实现了一个Sentence类基本上是一个带有一些元信息的ArrayList。我想写一下覆盖它的toString()方法,它只是粘贴用空格分隔的字符串。我通过使用继承的get方法来实现它,但我想知道是否可以更好地(在效率和编码实践方面)直接访问字段。
以下是我班级的简化版本:
public class Sentence extends ArrayList<String> {
int sentimentScore;
String Speaker;
@Override
public String toString(){
StringBuilder sb = new StringBuilder();
for(int i =0; i < super.size(); i++){
sb.append(super.get(i));
sb.append(" ");
}
return sb.toString();
}
答案 0 :(得分:2)
最好使用get()
方法。速度方面,它不应该减慢你的代码(如果你不相信,你应该写一个小程序来证明速度降低的影响,然后再坚持这个信念)。更重要的是,ArrayList
不会暴露其内部字段,这是一个很好的设计。如果维护者决定改变ArrayList
的内部实现,这种设计可以保护任何未来的副作用(扩展它的子类)。
顺便说一句,您可能还想考虑替代设计 - 而不是让Sentence
扩展 ArrayList
,让Sentence
包含 ArrayList
。这被称为组合而不是继承的原则。
来自维基百科:https://en.wikipedia.org/wiki/Composition_over_inheritance
继承的构成(或复合重用原则)in 面向对象编程是类应该的原则 通过组合实现多态行为和代码重用(通过 包含实现所需的其他类的实例 功能)而不是从基类或父类继承。 这是OOP经常陈述的原则,例如在有影响力的原则中 设计模式:“赞成'对象组成'超过'类 继承”。“