import java.util.*; public class MethodDesign { private Date startday; public MethodDesign() { } public MethodDesign(Date startday) { if(startday == null) throw new IllegalArgumentException("startday can not be null"); //保护性拷贝 this.startday = new Date(startday.getTime()); } public Date getStartday() { //保护性拷贝 return new Date(this.startday.getTime()); } @SuppressWarnings("unused") private void sort(long[] arr, int offset, int length) { assert arr != null; assert offset >= 0 && offset <= arr.length; assert length >= 0 && length <= arr.length - offset; } //overload重载方法的选择是在编译时决定的 public String classify(Set<?> s) { return "Set"; } public String classify(List<?> lst) { return "List"; } public String classify(Collection<?> c) { return "Unknown Collection"; } public static void main(String[] args) { MethodDesign md = new MethodDesign(); Collection<?>[] collections = { new HashSet<String>(), new ArrayList<Integer>(), new HashMap<String, String>().values() }; for (Collection<?> c : collections) System.out.println(md.classify(c)); Wine[] wines = { new Wine(), new SparklingWine(), new Champagne() }; for (Wine wine : wines) System.out.println(wine.name()); List<Integer> list = new ArrayList<Integer>(); for (int i = -3; i < 3; i++) { list.add(i); } for (int i = 0; i < 3; i++) { //删除Integer元素 list.remove(Integer.valueOf(i)); //按下标删除 //list.remove(i); } System.out.println(list); } } //override覆盖方法的选择是运行时决定的 class Wine { String name() { return "wine"; } } class SparklingWine extends Wine { @Override String name() { return "sparkling wine"; } } class Champagne extends SparklingWine { @Override String name() { return "champagne"; } }
输出为:
Unknown Collection
Unknown Collection
Unknown Collection
wine
sparkling wine
champagne
[-3, -2, -1]
* 检查方法参数的有效性:
绝大多数方法和构造器对传递给他们的参数值都会有些限制。
应该在文档中清楚地指明这些限制,并且在方法的开头检查参数,以强加这些限制。
如果传递了无效的参数给方法,那么它很快就会失败,并清晰地抛出适当的异常。
通常为:IllegalArgumentException、IndexOutOfBoundsException 或者 NullPointerException。
对于非public的方法,通常应该使用断言(assertion)来检查它们的参数。
断言是在声称被断言的条件将会为真,断言如果失败将会抛出AssertionError。
不同于一般的有效性检查,如果它们没有起到作用,本质上也不会有成本开销。
*************************************************************************
* 必要时进行保护性拷贝:
为了避免实例的内部信息受到攻击,对于构造器的每个可变参数进行保护性拷贝是必要的。
保护性拷贝是在检查参数的有效性之前进行的,并且有效性检查是针对拷贝之后的对象,而不是针对
传递进来的原始对象。
对于参数类型可以被不信任方子类化的参数,不要使用clone方法进行保护性拷贝。
public访问方法提供了对可变内部成员的访问,为了防御攻击,需要使它返回可变内部域的保护性拷贝。
*************************************************************************
* 谨慎设计方法的签名:
谨慎地选择方法的名称:方法的名称应该始终遵循标准的命名习惯。
首要目标是选择易于理解的,并且与包中其他名称风格一致的名称。
其次应该选择与大众认可的名称相一致的名称。
不要过于追求提供便利的方法:每个方法都应该尽其所能。方法太多会使类难以学习、使用、测试
和维护。
避免过长的参数列表:目标是四个参数或者更少。相同类型的长参数序列格外有害。
有三种方法缩短过长的参数:
第一种是把方法分解成多个方法,每个方法只需要这些参数的一个子集。
第二种方法是创建辅助类,用来保存参数的分组。这些辅助类一般为静态成员类。
第三种方法结合前两种,从对象构建到方法调用都采用Builder模式。
对于参数类型要优先使用接口而不是类。
对于boolean参数,要优先使用两个元素的枚举类型。
*************************************************************************
* 慎用重载:要调用哪个重载方法,是在编译时做出决定的。
java对于重载(overload)方法的选择是静态的(编译时决定)。
而对覆盖(override)方法的选择是动态的(运行时决定),选择的依据是被调用方法所在对象的运行时
类型。
对于API的用户来说,如果一组给定的参数,根本不知道哪个重载方法会被调用;那么使用这样的API
可能导致错误。
安全而保守的策略:永远不要导出两个具有相同参数数目的重载方法。如果方法使用可变参数
(varargs),保守的策略是根本不要重载它。
java1.5引入泛型和自动装箱后,破坏List的重载方法remove(int)和remove(E)。要删除Integer类型的数据,
参数必须为remove(Integer.valueOf(i))。remove(int)会按下标删除。
*************************************************************************
* 慎用可变参数(varargs):
java1.5增加可变参数的方法。可变参数方法接受零个或多个指定类型的参数。
可变参数的机制通过预先创建一个数组,数组的大小为在调用位置所传递的参数数量,然后将参数值传到
给数组中,最后将数组传给方法。
可变参数方法的每次调用都会导致一次数组分配和初始化。
*************************************************************************
* 返回零长度的数组或者集合而不是null:
对于不返回任何元素的调用,每次都返回同一个零长度数组是有可能的,因为零长度数组是不可变的,
而不可变对象有可能被自由地共享。
相关推荐
数据采集系统设计原则与基本方法 数据采集系统设计原则与基本方法是数据采集系统设计的基础,掌握这些原则和方法是设计高质量的数据采集系统的关键。本文将对数据采集系统设计的基本原则和方法进行详细的解释。 一...
而"界面设计原则之二_软件UI设计联盟_天无河_设计 UI CG 图标 标志.mht"、"界面设计原则-阿宇设计演绎.mht"以及"Windows界面设计标准 - The Zone of EIVS.mht"等资料,则提供了更深入的设计实例和具体平台的规范指南...
数据库索引设计原则 数据库索引设计原则是 Oracle 数据库管理系统中的一项重要技术,旨在提高数据库的查询效率和性能。以下是数据库索引设计原则的详细解释。 一、基本原则 数据库索引设计原则的基本原则是确保...
而对于其他模式和原则,应以类似的方式进行学习和应用,不断深入理解每个设计模式的特点和适用场景,以及设计原则的核心指导思想,最终能够在实际开发中灵活运用,编写出高质量、高内聚低耦合、易于扩展的代码。
理解并遵循EMI设计原则和电磁兼容设计原则对于提升电路板的抗干扰性能至关重要。 首先,我们要明白EMI是指由于电路中电流的变化产生的电磁场对周围环境产生的影响,这可能会影响其他电子设备的正常工作。为了减少...
gis系统设计方法原则 系统规划 规定系统采用的技术规范,并作出经费预算和时间安排,以保证系统总体目标的实现。最后撰写系统总体设计方案,作为重要的技术文件提供论证和审批。 地理信息系统设计与评价 gis系统设计...
发现了在触摸屏界面设计上存在的问题,深感触摸屏界面可用性的重要性以及在设计中人力物力投资的重复性,从而得出了为触摸屏界面提供一套通用的设计原则的必要性。 文章开篇第一章首先说明了一下研究背景...
面向对象设计原则是软件开发中不可或缺的指导方针,它们旨在提升软件的可维护性和复用性,从而提高开发效率和质量。C++作为一门支持面向对象编程的语言,遵循这些原则可以使代码更加健壮和易于扩展。以下是7个常用的...
### Java设计原则详解 #### 一、基本原则与实践 **原则1:避免不必要的代码重复** 根据Arthur J. Riel的观点,在设计时应当避免代码的重复。例如在第13页提到,应尽量减少相似功能模块的重写,这有助于提高代码的...
面向对象设计原则是软件开发中至关重要的一环,它关乎到代码的可维护性、扩展性和复用性。本文将深入探讨这些原则,并结合实例来解释它们的重要性。 首先,我们需要理解面向对象不仅仅是编程语言中的概念,如封装、...
【软件设计原则详解】 在软件开发领域,遵循一系列设计原则对于构建高质量、可维护和易于扩展的系统至关重要。以下是一些关键的软件设计原则,它们不仅适用于编程,还能应用于更广泛的生产活动和生活。 1. **Don’...
在Android开发中,设计模式和设计原则是提升代码质量、可维护性和可扩展性的重要工具。以下是关于"Android 24种设计模式介绍与6大设计原则"的详细阐述: 一、六大设计原则 1. **单一职责原则(Single ...
设计原则和设计模式是OOD的核心概念,它们为开发者提供了指导思想和最佳实践,以创建可维护、可扩展和易于理解的代码。在Swift中,遵循这些原则和模式可以帮助我们编写出更加灵活和高效的软件。 面向对象设计的原则...
软件设计的七大原则是软件设计的精髓所在,这七大原则分别是开闭原则、里氏代换原则、依赖倒置原则、接口隔离原则、合成/聚合复用原则、迪米特法则和抽象类原则。 一、 开闭原则(OCP) 开闭原则是指一个软件实体...
这个PDF文档“24种设计模式介绍与6大设计原则”旨在帮助开发者理解和应用这些模式,提高代码的可维护性和可扩展性。以下是其中的主要内容: 一、设计原则 1. 单一职责原则:一个类或模块应只有一个引起其变化的原因...
面向对象设计原则是Java开发中不可或缺的基础,它们指导着开发者创建可维护、可扩展和可复用的软件系统。本文将深入探讨其中的两个核心原则:“开-闭”原则(Open-Closed Principle, OCP)和里氏代换原则(Liskov ...
技术架构设计原则是在构建软件系统时所要遵循的一系列理念和规则,其目的是为了确保系统能够顺利地扩展和维护,同时满足性能、安全、稳定性等方面的要求。在设计技术架构时,有几大核心原则需要特别关注:大道至简、...