由java的extend的优劣引发的讨论技巧

针对项目中使用SpringCloud框架时是否采用大量继承的基础类进行讨论,分析了这种做法可能带来的问题,如代码耦合和后期维护难度增加,并提出了使用设计模式和代码生成器等替代方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近项目需要搭建一套基于springcloud的框架,在项目讨论会上。有同事说到做了一些basebean,basecontroller,baseservice,basedao等一些基础类。要求相关类都extend baseClass,就可以避免大多数重复代码,减少大部分的工作。我一听不对呀,这不是以前吃过的大亏吗?在等到同事介绍完所有的优点的时候,我简单的说了句。“在框架设计时避免使用大量extend”,由此引发的激烈的反驳。

对方的理由主要是3点:

1、java中extend是主要的特征之一,你居然说不能用。

2、extend能减少一半的工作量,你居然说这样的设计不好。

3、你连这些都不知道,怎么会如此的无知。

因为我们是跨3个区域的电话会议,在现场并没有马上反驳对方。会议结束后,我私下联系同事。主要陈述了随着项目开发的推进base臃肿、代码侵入耦合、领悟驱动设计的思想以及对后期维护的影响,还举例了struts1和strats2的设计区别。当然对方应该是没有听进去,还举例了一些填鸭式的解决方案。

主要理由是:

1,等base臃肿的时候重构,

2,base作为基础框架,类似于spring的作用。

3、base的维护是有权限的,避免每个人都有修改的权限带来的系统不稳定性。

讨论在这里我内心久久不能平静,我想这样的事情应该在大多数团队都存在,这也因该是中国软件技术的现状吧?其实在extend的优劣在网上已经有大量的讨论,我也没必要在这里重复。对于好学的人和有一定技术追求的人都能思考这样的问题。我的观点很明确,两种观点都能完成我们的项目设计和开发,从项目健壮性合理性我是支持避免extend的框架。这里我想是一个逻辑问题的思考,我的父亲是一个聪明的木工,我继承了他的聪明,但我并没有继续做木工,而是软件开发(不能强迫我去extend父亲一切)。

下面说extend问题和解决问题的方法。
问题主要是两点:
1、对顶层超类的改动可能会使与其相关的所有子类出现不正确的操作。
2、给子类的修改带来复杂度。
3、extend的单继承的局限性。
解决办法:
1、使用设计模式

类的组合或者装饰模式等 

2、编写代码生成器



由此我想就提问这个话题引发的思考,提问一般有三种情况:
1、质疑
2、反驳
3、求证
对于这三种情况大家应该都比较清楚区别。


特别是在会议上,在别人陈诉时如果没有足够的考证不要打断别人。会议理当应该避免质疑的发言,因为在质疑别人之前务必要做好充分的准备和思考,否则引发的讨论都是在浪费大家的时间。我想在工作中和生活中,聆听别人的意见总会有一种收获。
Java 中,`extends` 关键字用于实现类的继承,允许一个类(子类)继承另一个类(父类)的属性和方法。通过继承,可以实现代码的重用并建立类之间的层次关系。Java 不支持多重继承,即一个类不能直接继承多个父类,但可以通过接口实现类似的功能。 ### 类继承的基本语法 ```java class ParentClass { // 父类的属性和方法 } class ChildClass extends ParentClass { // 子类的属性和方法 } ``` 在上面的代码中,`ChildClass` 继承了 `ParentClass` 的所有非私有属性和方法。子类可以直接访问这些属性和方法,除非它们在父类中被声明为 `private`。 ### 方法重写(Override) 在子类中,可以重写父类的方法以提供不同的实现。父类的方法需要标记为 `virtual`(在 Java 中,所有非静态、非私有方法默认是 `virtual` 的,因此可以被重写)。重写方法时,方法签名(方法名称、参数列表)必须与父类中的方法一致,但可以修改方法的实现。 ```java class Animal { public void makeSound() { System.out.println("Animal makes a sound"); } } class Dog extends Animal { @Override public void makeSound() { System.out.println("Dog barks"); } } ``` 在上面的示例中,`Dog` 类重写了 `Animal` 类的 `makeSound()` 方法,并提供了不同的实现。 ### 继承的层次结构 Java 中的所有类都直接或间接地继承自 `Object` 类。`Object` 类是 Java 中所有类的根类,它提供了一些基本的方法,例如 `toString()`、`equals()` 和 `hashCode()`,这些方法可以在所有类中使用。 ```java class SuperHero { @Override public String toString() { return "This is a superhero"; } } ``` 在上面的代码中,`SuperHero` 类继承了 `Object` 类,并重写了 `toString()` 方法以提供自定义的字符串表示。 ### 抽象类和接口 除了普通类的继承Java 还支持抽象类和接口的继承。抽象类可以包含抽象方法(没有实现的方法),而接口可以包含默认方法和静态方法。子类可以通过 `extends` 关键字继承抽象类,并实现其抽象方法;通过 `implements` 关键字实现接口并提供接口方法的具体实现。 ```java abstract class Shape { abstract double area(); } class Circle extends Shape { double radius; Circle(double radius) { this.radius = radius; } @Override double area() { return Math.PI * radius * radius; } } ``` 在上面的代码中,`Circle` 类继承了抽象类 `Shape`,并实现了其抽象方法 `area()`。 ### 多层继承 Java 支持多层继承,即一个类可以继承另一个子类,从而形成一个继承链。例如,`GrandchildClass` 可以继承 `ChildClass`,而 `ChildClass` 又继承 `ParentClass`。 ```java class GrandparentClass { public void grandparentMethod() { System.out.println("Grandparent method"); } } class ParentClass extends GrandparentClass { public void parentMethod() { System.out.println("Parent method"); } } class ChildClass extends ParentClass { public void childMethod() { System.out.println("Child method"); } } ``` 在上面的代码中,`ChildClass` 继承了 `ParentClass`,而 `ParentClass` 又继承了 `GrandparentClass`,从而形成了一个继承链。 ### 继承与构造函数 在子类的构造函数中,可以使用 `super` 关键字调用父类的构造函数。如果子类的构造函数没有显式调用父类的构造函数,Java 会自动调用父类的无参构造函数。如果父类没有无参构造函数,子类的构造函数必须显式调用父类的构造函数。 ```java class ParentClass { ParentClass(String message) { System.out.println("ParentClass constructor: " + message); } } class ChildClass extends ParentClass { ChildClass(String message) { super(message); // 调用父类的构造函数 System.out.println("ChildClass constructor: " + message); } } ``` 在上面的代码中,`ChildClass` 的构造函数显式调用了 `ParentClass` 的构造函数,并传递了一个参数。 ### 总结 `extends` 关键字在 Java 中用于实现类的继承,允许子类继承父类的属性和方法。通过继承,可以实现代码的重用并建立类之间的层次关系。子类可以重写父类的方法以提供不同的实现,并且可以通过 `super` 关键字调用父类的构造函数。Java 中的所有类都直接或间接地继承自 `Object` 类,它提供了一些基本的方法供所有类使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值