Java 面向对象编程 tricks
- 方法中描述了参数:
1. 构造器重载
重载构造器时,使用描述了参数的静态工厂方法名,这样做的意义何在呢?就在于为动作赋予意义,提升代码的可解释性:
- 传统的实例化方式:
Complex fulcrumPoint = new Complex(23.0);实例化对象时,显然,new ClassName(param1, param2);并不能为我们提供参数的意义为何。使用描述了参数的静态工厂方法(工厂方法,new 出类实例),其实是对构造函数的进一步封装;
- 解释性更清晰的方式:
Complex fulcrumPoint = Complex.fromRealNumber(23.0);当然可以考虑将相应的构造器设置为 private,强制这种命名手段。
JDK 实践:
Calendar calendar = Calendar.getInstance();(当然这里仅仅是为了说明获取类的实例化对象,单例设计模式),本处更想说明的是,构造函数也是一种函数,只是这种函数,并没有指定清晰的含义,尤其是当其参数较多时;
2. switch 的处理:将 switch 语句置于抽象工厂下
public Money calcPay(Employee e) throws InvalidEmployeeType {
switch (e.type) {
case COMMISSIONED:
return calcCommissionedPay(e);
case HOURLY:
return ..;
default:
throw new InvalidEmployeeType(e.type);
}
}
- switch 破坏了单一职责(SRP,Single Responsibility Principe),以及开闭原则(OCP,Open-Closed Principe),当有新的类型适配时,就需对代码做出修改;
- OCP,对扩展是开放的,所谓的扩展,这里指的即是,新的同级的类的添加,以支持新类型的拓展,自然在新添加的类内部有其不一样的实现;
改造:将 switch 语句置于抽象工厂下,而不让任何人看到;
/**
* 全体雇员子类的抽象基类,抽象工厂获取类的实例时返回的便是基类(父类引用)
*/
public abstract class Employee {
public abstract boolean isPayday();
public abstract Money calcPay();
public abstract void deliverPay(Money money);
} /**
* 抽象工厂接口声明
*/
public interface EmployeeFactory {
public Employee makeEmployee(EmployeeRecord record) throws InvalidEmployeeType;
} /**
* 抽象工厂的实现类
*/ public class EmployeeFactoryImpl implements EmployeeFactory {
public Employee makeEmployee(EmployeeRecord record) throws InvalidEmployeeType {
switch (record.type) {
case ..:
return new XXEmployee();
case ...:
return new XXEmployee();
default:
throw new InvalidEmployeeType(record.type);
}
}
}
Java 面向对象编程 tricks的更多相关文章
- Java面向对象编程基础
一.Java面向对象编程基础 1.什么是对象?Object 什么都是对象! 只要是客观存在的具体事物,都是对象(汽车.小强.事件.任务.按钮.字体) 2.为什么需要面向对象? 面向对象能够像分析现实生 ...
- java 面向对象编程。。。。
经过一周的学习(java),总结了许多,对java的理解,java的类型,运用,安装,基础语法,变量,常量,表达式,语句 java从C语言中继承了大量语言特性.java面向对象编程的基本特征,包括继承 ...
- 《Java面向对象编程》
<Java面向对象编程> 第11章 对象的生命周期 11.1 创建对象的方式 用new语句创建对象 运用反射手段,调用java.lang.Class 或者 java.lang.Const ...
- JAVA面向对象编程课程设计——网络版单机斗地主
一.团队介绍 成员姓名 任务分配 成员课程设计博客链接 兰泽祥(组长) 数据库,斗地主规则的实现,人机自动出牌的算法,实体类的设计 JAVA面向对象编程课程设计--web版斗地主 吴修恩 JSP界面的 ...
- JAVA面向对象编程课程设计——web版斗地主
一.团队课程设计博客链接 JAVA面向对象编程课程设计--网络版单机斗地主 二.个人负责模块或任务说明 实体类的设计 斗地主规则的实现 人机自动出牌的算法 实现数据库的DAO模式 三.自己的代码提交记 ...
- java面向对象编程知识点总结
一:今天完成 上午详细了解了java面向对象编程的一些细节,记录如下. 1)类 是一种引用类型,包含一个签名和一个主体,主体是放在花括号里面的成员,成员包括字段和方法,还有构造方法.初始化程序和嵌套类 ...
- Java面向对象编程(一)
由于常常将Java和C++面向对象编程的原则搞乱,所以这次把相关要点分别总结一下,本文主要总结Java面向对象编程. 面向对象编程的三大特性是:继承性(inheritance), 多态性(polymo ...
- JAVA学习(五):Java面向对象编程基础
Java面向对象编程基础 面向对象(Object oriented programming,OOP)技术是一种强有力的软件开发方法,它採用数据抽象与信息隐藏技术,来使软件开发简单化,以达到代码重用的目 ...
- (一)如何理解java面向对象编程
哲学中,事物总是螺旋式上升,波浪式前进.因而编程也逐渐向人类更容易理解的方向前进,多年来人们苦苦追求的编程境界 : 高扩展性(extensibility),高复用性(reuseable).java语言 ...
随机推荐
- python并发编程之多进程2-(数据共享及进程池和回调函数)
一.数据共享 1.进程间的通信应该尽量避免共享数据的方式 2.进程间的数据是独立的,可以借助队列或管道实现通信,二者都是基于消息传递的. 虽然进程间数据独立,但可以用过Manager实现数据共享,事实 ...
- 解释python中join()和split()函数
join能让我们将指定字符添加至字符串中 a=') print(a) print(type(a)) #1,2,3,4,5,6 #<class 'str'> split()能让我们用指定字符 ...
- python之路 内置函数,装饰器
一.内置函数 #绝对值 abs() #所有值都为真才为真 all() #只要有一个值为真就为真 any() #10进制转成二进制 bin() #10进制转成八进制 oct() #10进制转成十六进制 ...
- curl操作封装
<?php /** * Class Curl curl简单封装 get post */ class Curl { /** * @brief get请求 * @param $url 请求的url ...
- 利用 :before 特性实现图片按比例显示
好吧,想不到自称布局小沙弥的我会被图片按比例显示给尴尬到. 设计师跟我说,这里的图要按 750x330 的,好吧,但这图是屏宽呀,屏幕宽度会变化的,那高度也会不定咯, 要么裁图片(工作量大),要么给定 ...
- weblogic启动错误 Unrecognized option: -jrockit
高版本jdk启动低版本weblogic有时会报Unrecognized option: -jrockit参数错误 这纯粹是版本问题,版本更新更换参数名称的缘故 解决方法: “%WL_HOME%\com ...
- nodejs/REPL环境命令行操作命令
1,输入node 进入node[REPL]环境 2,按两次[ctrl+c]退出node[REPL]环境 3,上箭头会查找上次输入的命令 4,cls清屏 5,tab键会自动补全路径 6,REPL环境
- SQL Server获取数据库的当前连接状态
SELECT * FROM [Master].[dbo].[SYSPROCESSES] WHERE [DBID]=(SELECT [DBID] FROM [Master].[dbo].[SYSDATA ...
- flume 使用遇到问题及解决
1. ../flume/fchannel/spool/data/ 目录下发生缓存文件积压 可能原因:同一时间同一客户端下向两个监控目录mv文件:或同一时间多个客户端向服务端上传文件 2.清空../fl ...
- 音乐下载api
青檬音乐 http://tingapi.ting.baidu.com/v1/restserver/ting?from=android&version=5.6.5.6&format=js ...