这种Java面向对象设计是否属于OOP滥用?
这种设计属于Java OOP的不良实践(甚至可称为滥用)
这确实是对Java面向对象编程核心原则的违背,咱们来拆解一下问题所在:
1. 核心问题:违反里氏替换原则(LSP)
里氏替换原则是OOP继承体系的核心规则之一——派生类应该可以无缝替换基类,且不改变程序的预期行为。
在这个场景里,ArrayCount继承了Array,并重写了add方法来统计元素数量。任何使用ArrayCount的开发者都会预期:调用addAll添加多个元素时,每个元素的添加都会触发count的递增。但实际情况是,基类Array的addAll直接操作私有集合a,完全绕过了公共的add方法,导致派生类的统计逻辑根本不会执行,这就打破了用户的预期,也违背了LSP。
2. 基类设计的致命缺陷
基类Array的addAll方法没有利用自身的add方法,而是直接操作私有成员变量a。这种写法完全阻断了派生类对add方法的扩展能力,相当于浪费了继承机制的多态特性。
修正后的基类实现
只需要把addAll里的调用改成自身的add方法,就能修复这个问题:
import java.util.ArrayList; public class Array { private ArrayList<Object> a = new ArrayList<Object>(); public void add(Object element) { a.add(element); } public void addAll(Object elements[]) { for (int i = 0; i < elements.length; ++i) this.add(elements[i]); // 改为调用公共的add方法,让多态生效 } }
3. 为什么这算OOP滥用?
OOP的继承机制是为了让派生类能够扩展或修改基类的行为,但这个基类的实现直接封死了这种可能性。开发者使用派生类时会遇到“直觉上应该生效的逻辑却完全没反应”的情况,不仅容易引发难以排查的bug,也违背了OOP设计的初衷——代码的可扩展性和可维护性。
内容的提问来源于stack exchange,提问作者Richard Eng
相关产品推荐
相关产品推荐

