`
href
  • 浏览: 7794 次
  • 性别: Icon_minigender_1
  • 来自: 福建
最近访客 更多访客>>
社区版块
存档分类
最新评论

方法

阅读更多
第23条:检查参数的有效性
极大多数方法和构造函数都会对于传递给他们的参数值有某些限制。你应该在文档中清除的指明这些限制,并且在方法体的起始处对参数进行检查,以强迫施加这些限制。

如果一个无效的参数值被传递给一个方法,而这个方法在执行之前首先对参数进行检查,则它很快会失败,并且清除的以一个适当的异常指明错误原因。如果这个方法没有进行参数检查,有可能会发生几种情形。处理过程中失败,并且尝试一个令人迷惑的异常。更差的是,反悔正常,但计算结果是错误的。最糟糕的是,正常返回,但使得对象处于一种被破坏的状态,在某个不确定的时候引发出来错误。

非公有的方法通常应该使用断言来检查他们的参数,而不使用正常的检查语句。如果你使用的开发支持断言,那么你应该使用断言,否则话,你应该使用一种临时的断言机制。

在一个方法执行它的计算任务之前,应该检查它的参数,这条规则也有例外,一个很重要的例外是,在某些情况下,有效性检查工作非常昂贵,或者更本是不且实际的,并且在计算过程中有效性检查工作也被隐含着完成了。

第24条:需要时使用保护性拷贝
假设类的客户尽一切手段来破坏这个类的约束条件,在这样的前提下,你必须保护性的设计程序。编写出一些面对客户的不良行为时仍能保持健壮的类是非常值得投入时间去做的。
public final class Period{
  private final Date start;
  private final Date end;
  public Period(Date start,Date end){
    if(start.compareTo(end)>0){
     throw new IlleagalArgumentException(start+"after"+end);
     this.start=start
     this.end=end
    }
  }
}
但是
Date start=new Date();
Date end=Date();
Period p=new Period(start,end);
end.setYear(78); end被改变了。

对于构造函数的每个可变参数进行保护性拷贝是必要的
public final class Period{
  private final Date start;
  private final Date end;
  public Period(Date start,Date end){
    this.start=new Date(start.getTime())
     this.end=new Date(end.getTime())
    if(start.compareTo(end)>0){
     throw new IlleagalArgumentException(start+"after"+end);
    }
  }
}
保护性拷贝动作是在检查参数的有效性之前进行的,并且有效性检查是针对拷贝之后的对象,而不是原始的对象。参数类型可以被不可信方子类化的情形,请不要使用clone方法进行参数的保护性拷贝。

在把可变参数融入到一个对象内部之前进行保护性拷贝并不总是合适的,对于有些方法和构造函数,他们在被调用的时候,其参数所引用的对象有一个显示的交接过程,当客户调用这样的方法的时候,他承诺以后不在直接修改该对象。

如果一个方法或者构造函数期望接管一个由客户提供的可变对象,那么它必须在文档中明确指明这一点。

第25条:谨慎的设计方法的原型
1.谨慎选择方法名字:
2.不要过于追求提供便利的方法:方法太多会使一个类难以学习,使用,文档化,测试和维护。对于接口而言,这无疑是正确的,接口的方法太多会使接口实现者和接口用户的生活变的复杂化。
3。避免长长的参数列表。通常,三个参数应该被看做实践中的最大值,而且参数越少越好。类型相同的长参数列表尤其有害。用户不仅不能够记住参数的顺序,而且当他们弄错了时候,程序仍然可以运行,只不过不会按照编写程序人的意图。

有2项技术可以缩短太长的参数列表。
1.把一个方法分解成多个方法,每一个方法只要求这些参数的子集。
2.创建铺筑类,用来保存参数的聚集。(创建个类,参数列表作为属性,用于这个参数列表频繁使用)

3.对于参数类型,悠闲使用接口而不是类。

4.谨慎的使用函数对象 (匿名类方式)

第26条:谨慎的使用重载
public class CollectionClassifier{
   public static String classify(Set s){
       return "Set"
   }
   public static String classify(List l){
       return "List"
   }
    public static String classify(Collection c){
       return "Unknow Collection"
   }

   public static void main(String[] args){
    Collection[] tests=new Collection[]{new HashSet(),new ArrayList(),new                  HashMap().values()};
    for(int i=0;i<tests.length;i++){
      System.out.println(classify(tests[i]));
    }
   }
}
结果是打印三个 unkonw collection
原因:调用哪个重载方法是在编译时刻作出的决定。每次迭代的运行参数类型不同,但这不影响对重载方法的选择。

对于重载方法的选择是静态的,而对于被改写的方法的选择是动态的。

被改写的方法,选择的依据是被调用方法所在对象的运行时类型。

修正重载带来的方案是,用一个方法来替换这三个重载的方法,并且在这个方法中一个显示的instanceof测试。

一个安全而保守的策略是永远不要导出两个具有相同参数数目的重载方法。

重载的函数参数不应该存在父子关系,否则容易引发问题。但是例外的是,他们执行相同的功能,返回相同的结果,则重载不会带来危害,确保这种行为的标准做法是,让更一般化的重载方法把调用转发给更特殊的重载方法。
public int comareTo(Objecto){
   return compareTo((String)o);
}

第27条:返回零长度的数组而不是null
因为没有理由要求客户必须有额外的代码来处理null返回值。客户很容易忘记写专门的代码处理null返回值。

nul返回值比零长度数组更好,因为它避免了分配数组所需要的开销,这种观点是站不住脚的,原因有两条,第一,在这个层次上担心性能问题是不明智的,除非分析表明这个方法正式造成性能问题的真正源头。第二,对于不返回任何元素的调用,每次都返回同一个零长度的数组是有可能得,因为零长度是非可变的,而非可变对象有可能被自由的共享。

标准做法:private final static Cheese[] NULL_CHEESE_ARRAY=new Cheese[0];
public Chees[] getCheeses(){
  return (Cheese[]) Collection.toArray(Object[]);
}

没有理由从一个取数组的方法中返回null而不是返回一个零长度数组。

第28条:为所有导出的api元素编写文档注释
为了正确的编写api文档,你必须在每一个被导出的类,接口,构造函数,方法和域声明之前增加一个文档注释。

每一个方法的文档注释应该简洁的描述出它和客户之间的约定。这个约定应该说明了这个方法做了什么,而不是说明它是如何完成这项工作的。文档注释应该列举出这个方法所有的前提条件和后置条件,除此之外每个方法也应该在文档中描述它的副作用。

分享到:
评论

相关推荐

    数据安全治理能力评估方法

    数据安全治理能力评估方法数据安全治理能力评估方法数据安全治理能力评估方法数据安全治理能力评估方法数据安全治理能力评估方法数据安全治理能力评估方法数据安全治理能力评估方法数据安全治理能力评估方法数据安全...

    Java常用的反射方法

    代码中包含的方法有如下 : 1. 创建一个Person实体类 2. 反射获取Class类对象的三种方法 2.1 通过全类名的方式获取 2.2 类名.class 2.3 实例对象.getClass() 2.4 总结 3. 反射获取属性变量 3.1 获取所有...

    Junit测试Void方法

    ### Junit 测试 Void 方法详解 在软件开发过程中,单元测试是确保代码质量的重要手段之一。JUnit 是 Java 开发者常用的单元测试框架,它能够帮助开发者编写自动化测试案例,从而提高代码的质量和可维护性。然而,...

    利用PowerMock模拟静态方法和私有方法的示例

    然而,有些情况下,正常的单元测试框架可能无法覆盖到所有的情况,比如静态方法和私有方法的测试。这时,我们就需要引入特殊的工具,如PowerMock。本文将详细介绍如何利用PowerMock来模拟静态方法和私有方法,以便...

    易语言取类指针及方法指针

    在易语言中,“取类指针”和“方法指针”是面向对象编程中的关键概念,用于实现对象间的信息交互和方法调用。 1. **取类指针**: 类指针是面向对象编程中的一个重要概念,它代表了一个类实例的地址。在易语言中,...

    数值方法 第二版 答案

    《数值方法 第二版》是由金一庆、陈越、王冬梅三位知名学者编著的一本关于数值计算的经典教材。这本书深入浅出地介绍了数值分析领域的核心概念、理论和应用,是计算机科学、工程计算、数学等领域学习者的重要参考...

    matlab做谱方法

    ### MATLAB中的谱方法知识点概述 #### 一、引言与背景 在数学和工程领域,谱方法是一种基于函数展开的数值解法,主要用于求解偏微分方程(PDE)和常微分方程(ODE)。MATLAB作为一种强大的计算工具,提供了丰富的库和...

    安全架构设计方法指南.pptx

    华为出品-安全架构设计方法指南,讲解安全架构设计的来源、软件系统架构与安全架构的定义,常见的系统架构表现形式,安全架构视图,安全架构设计的基本步骤和参考,基于八维度设计框架的安全架构设计方法,维度安全...

    Android打印主线程所有方法执行时间

    我们知道Android卡顿主要是主线程中有耗时操作导致的,那么我们怎么能方便快捷的获取主线程中的所有耗时方法执行时间呢?今天我们来介绍两个方案 方案一:利用Looper.java中loop()方法的logging.print的特殊关键字...

    有限元方法的数学基础.pdf

    有限元方法是一种用于求解工程技术中复杂问题的数值分析技术,尤其在结构分析、热传导、流体力学等领域中得到广泛的应用。其数学基础主要涉及到数学分析、泛函分析、偏微分方程等数学分支。 在有限元方法的数学基础...

    华罗庚统筹方法.pdf

    华罗庚统筹方法 华罗庚统筹方法是一种数学方法,旨在解决生产建设服务中的问题。这种方法的实用范围非常广泛,可以应用于国防、工业生产管理、复杂的科研项目组织与管理等领域。 在华罗庚统筹方法中,通过对任务的...

    最优化方法习题+答案

    最优化方法是数学和计算机科学领域的一个重要分支,它研究如何在给定的条件下找到最佳解,例如最小化或最大化某个目标函数。这个主题广泛应用于工程设计、经济规划、数据分析等多个领域。根据提供的标题和描述,我们...

    数值计算方法 (冯康).pdf

    冯康先生的《数值计算方法》是该领域的经典之作,它详细介绍了数值分析的理论与实践,涵盖了求解数学问题的数值方法与过程。文章首先介绍了计算方法课程的主要内容,强调了计算机数系和误差的基本概念,为学习后续...

    哈工大计算方法实验

    在哈工大的计算方法实验中,学生将深入学习并实践一系列关键的数值分析技术,这些技术在解决实际问题时有着广泛的应用。以下是针对实验中涉及的几个重要知识点的详细解释: 1. **Lagrange插值法**:Lagrange插值是...

    JS调用C#后台方法

    标题"JS调用C#后台方法"描述了这种跨语言通信的需求。本文将深入探讨如何使用JavaScript调用C#编写的后台方法,并介绍相关技术与实践。 首先,JavaScript作为客户端脚本语言,运行在用户的浏览器上,而C#通常是...

    数值计算方法答案 1-7章

    数值计算方法是计算机科学与工程领域中的重要学科,它研究如何用近似方法解决数学问题,特别是在实际计算中无法得到精确解的情况下。本资源“数值计算方法答案 1-7章”由曾金平主编,出版于湖南大学出版社,提供了前...

    广工数值计算方法试卷

    数值计算方法是计算机科学与工程领域的重要组成部分,它涉及到使用近似手段解决数学问题,尤其是那些直接计算难以解决的复杂数学问题。在当今科学技术迅猛发展的时代,数值计算方法已被广泛应用于物理、工程、金融、...

    2设计方法与策略:代尔夫特设计指南.pdf

    《设计方法与策略:代尔夫特设计指南》是代尔夫特理工大学工业设计工程学院50多年来对产品设计方法的经验总结。众所周知,传统的设计教材总是枯燥地解释方法,而忽略了实际应用。《设计方法与策略:代尔夫特设计指南...

Global site tag (gtag.js) - Google Analytics