`
schumee
  • 浏览: 25846 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论
文章列表
谨慎选择方法的名字 选择易于理解的,并且与同一个包中的其他名字风格一致; 选择与大众认可的名字一致; 不要过于追求提供便利的方法。过多的方法会增加类的学习和使用成本,只有当一个操作被用得非常频繁的时候,才考虑为他提供一个快加的方法。   避免过长的参数列表。太长的参数不便于使用者使用,尤其是参数类型相同的时候,很容易产生参数传递错误的问题。避免此类错误的方法: 可以把一个方法分解成多个方法; 可以创建一个辅助类(helper class)。将参数组织成一个类作为参数传入; 对于类型参数,优先使用接口,而不是类。如参数为Map的时候,该方法可以接收Hashtable、H ...
假设类的使用者会尽一切手段来破坏这个类的约束条件,在这样的前提下,你必须保护性地设计程序。面对客户的不良行为时仍然能保持健壮性的类。 对于一个非可变类,可以考虑对其构造函数的可变参数采用保护性拷贝,如 public period(Date start, Date end){ this.start = new Date(start.getTime()); this.end = new Date(start.getTime()); // 接着做其他逻辑(保护性拷贝要在其他逻辑之前进行,并且有效性检查是针对拷贝后的对象,而不是原始对象) } ...
假设类的使用者会尽一切手段来破坏这个类的约束条件,在这样的前提下,你必须保护性地设计程序。面对客户的不良行为时仍然能保持健壮性的类。 对于一个非可变类,可以考虑对其构造函数的可变参数采用保护性拷贝,如 public period(Date start, Date end){ this.start = new Date(start.getTime()); this.end = new Date(start.getTime()); // 接着做其他逻辑(保护性拷贝要在其他逻辑之前进行,并且有效性检查是针对拷贝后的对象,而不是原始对象) } ...
非公有的方法我们应该用断言的方法来检查它的参数,而不是使用通常大家所熟悉的检查语句来检测。如果我们使用的开发平台是JDK1.4或者更高级的平台,我们可以使用assert结构;否则我们应该使用一种临时的断言机制。   有些参数在使用过程中是先保存起来,然后在使用的时候再进行调用,就必须做好检查工作,否则程序可能会抛出一些异常让你摸不着头脑(如常见的空指针 异常),也不能马上定位问题的所在位置,构造函数正是这种类型的一种体现,所以我们通常对构造函数参数的有效性检查是非常仔细的。   总之,当编写一个方法或者构造函数的时候,应该考虑对应它的参数有哪些限制,并且要把这些限制写到文档中,在方法体 ...
第19条 --- 用类代替结构   JAVA刚面世的时候,很多C程序员都认为用类来代替结构现在太复杂,代价太大了,但是实际上,如果一个JAVA的类退化到只包含一个数据域的话,这样的类与C语言的结构大致是等价的。 比方说下面 ...
嵌套类只为它的外围类提供服务。嵌套类分为四种:静态成员类、非静态成员类、匿名类和局部类(后面三种称为内部类)   如果一个嵌套类的实例可以在它外类类的实例之外独立存在,则这个嵌套类应该设置成静态成员类(即:如果你声明的成员类不要访问外围实例,那么应该把static修饰符放到成员类的声明中)。 匿名类的用法: 创建一个函数对象; 创建过程对象; 在静态工厂方法的内部使用; 在复杂的类型安全枚举类型(它要求为每个实例提供单独的子类)中,用于公有的静态final域的初始化器中; 总结:四种不同的嵌套类都有自己不同的用途,如果一个嵌套类需要在单个方法之外任然是可见的,或者它太长,不适 ...
接口只是用来定义一个类型,不要把接口用来做其他的事情(如在接口中定义常量,这种常量接口模式是对接口的不良使用)。   如果要导出常量,可以有以下几种方式: 如果这些常量与某个已有的类或者接口有着紧密的联系,则可以把常量添加到这个类或者接口中。 定义一个类型安全的枚举类,把这些常量看做枚举类型的成员。 使用一个可以实例化的工具类(构造函数设为privat类型)来导出这些常量。   本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ilibaba/archive/2009/02/03/3860582.aspx  
接口和抽象类的区别: 抽象类允许包含默写方法的实现,而接口是不允许的; 一个类要实现抽象类,它必须成为抽象类的一个子类,而实现接口的类只要定义了所要求的方法,并遵守通用的约定,不管这个类位于类层次的哪个地方; 接口可以构造出非层次结果的类型框架,比如一个接口可以继承多个其他的接口。还可以安全地增加一个类的功能。   当然,也可以把接口和抽象类的有点结合起来,对于你期望导出的每一个总要的接口,头提供一个抽象的骨架实现类,这样,接口的作用仍然是定义类型,骨架实现类负责所以与接口实现相关的工作。   抽象类也有明显的优势,它可以在一个类的后续的版本中方便的增加一个新的方法,但不影响到 ...
对并没有文档说明的类进行继承是非常危险的,它的公有方法有可能被改变。在设计一个专门用来继承的类时必须注意以下几点(不适用于final类): 必须精确地描述改写每个方法带来的影响,虽然这样的描述违法了文档格言“好的API文档应该描述一个方法做了什么工作,而不是描述它如何做”,但这也是继承破坏了程序的封装性而导致的。 允许继承的类的构造函数一定不能调用可被改写的方法,无论是直接进行还是间接进行。因为超类的构造函数会在子类的构造函数之前运行,所以子类中改下版本的方法将会在子类的构造函数运行之前就被调用。如: package com.ilibaba.test; import java ...
实现代码重用最重要的办法就是继承,但是继承破坏了封装,导致软件的键壮性不足。如果子类继承了父类,那么它从父类继承的方法就依赖父类的实现,一旦他改 变了会导致不可预测的结果。如果子类和超类在不同的包中,并且超类并不是为了扩展而设计的,那么继承会导致脆弱性。   作者介绍了 InstrumentedHashSet作为反例进行说明,原因就是没有明白父类的方法实现。作者给出的解决办法是通过化合来代替继承,尤其是当存在一个 适当的接口来实现一个包装类的时候,用包装类和转发方法来解决问题。把想扩展的类作为本类的一个private final得成员变量。把方法参数传递给这个成员变量并得到返 ...
为了使一个类成为非可变类,要遵循下面五条规则: 不要提供任何会修改对像的方法; 保证没有可被子类改写的方法; 使所有的域都是final的; 使所有的域都成为私有的; 保证对于任何可变组件的互斥访问。(如果一个类指向可变对象的域,则必须确保该类的客 户无法活得指向这些对象的引用,并且永远不要用客户提供的对象引用来初始化这样的域,也不要在任何一个访问方法中返回该对象的引用); 以上规则比真正的要求强了一点,为了提高性能可以有所方式,如:保证没有一个方法能够对对象的状态产生外部可见的改变,许多非可变的类拥有一个或者多个非final的冗余域,把一个开销昂贵的计算结果缓存在这些域中。非可变 ...
好的模块设计应该尽最大可能封装好自己的内部信息,这样可以把模块之间的耦合程度降到最低。开发得以并行,无疑这将加快开发的速度,便于系统地维护。Java中通过访问控制符来解决这个问题。   public表示这个类在任何范围都可用。 protected表示只有子类和包内的类可以使用 private-package(default)表示在包内可用 private表示只有类内才可以用 在设计的时候应该尽可能的使每一个类或者成员不被外界所访问。在设计一个类的时候应该尽量的按照4321得顺序设计。如果一个类只是被另一个类使用,那么应该考虑把它设计成这个类的内部类。通常 public的类不应该有publi ...
compareTo方法是java.lang.Comparable接口中的唯一方法,它允许进行简单的相等比较,也允许执行顺序比较,一个类实现了 comparable接口就表明他的实例具有内置的排序关系。Java平台库中所有的值类都实现了Comparable。将当前对象与指定对象进行顺序比较的时,返回负整数,0或者正整数(<、=、>),如果指定对象的类型无法进行比较,则抛出ClassCastException或者NullPointException异常,compareTo方法应遵守如下限制条件:自反性、对称性、传递性和非空性的限制条件。在实现数值比较的 compareTo方法时还要防止值 ...
一个对象要想被Clone,那么要实现Clone()接口,这个接口没有定义任何的方法,但是如果你不实现这个接口的话,调用clone方法的时候会出现 CloneNotSupportedException,这就是作者叫做mixin的接口类型。通常clone()方法可以这样覆盖: pub ...
在Object的toString方法返回的形式是Class的类型加上@加上16进制的hashcode,非常难以理解。最好在自己的类中提供toString方法更好的表述实例的信息,不然别人怎么看得明白呢。   在实际应用中,toString方法应该返回对象中包含的所有令人感兴趣的信息。同时,最好在程序中提供一个相匹配的构造函数或者静态工厂方法,便于程序员在对象和它的字符串表示之间进行来回转换。   在实现toString方法的时候,必须要做出是否在文档中指定返回值的格式的决定。指定格式可以被用来做为一种标准的,无二意性的表达形式,但这样也会 使字符串的表示嵌入到永久数据中,如果以后改变了 ...
Global site tag (gtag.js) - Google Analytics