`
href
  • 浏览: 7760 次
  • 性别: 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 获取所有...

    计算方法与实习 课后习题答案

    《计算方法与实习》是计算机科学与技术领域中的一门重要课程,主要研究数值计算的理论、方法和实现。这门课程旨在培养学生解决实际问题的能力,通过实习环节加深对计算方法的理解。课后习题是巩固理论知识和提高实践...

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

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

    数值方法 第二版 答案

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

    matlab做谱方法

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

    最优化方法习题+答案

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

    C#定时器实现自动执行的方法

    本文实例讲述了C#定时器实现自动执行的方法。分享给大家供大家参考。具体实现方法如下: 代码如下: //下面讲一个打开窗体定时执行按钮的东西 private void Form1_Load(object sender, EventArgs e) { System.Timers...

    龙格库塔方法合集

    在工程应用中往往需要对N维一阶状态微分方程求解,有些方程为刚性方程,则需要隐式方法,有些方程需要变步长进行求解等。为了解决上面的需求,我对各种龙格库塔方法进行了搜集整理。满足了不同情况的需求。对N维一阶...

    哈工大计算方法实验

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

    《数值计算方法》丁丽娟 课后习题答案

    《数值计算方法》是计算机科学和数学领域中的一门重要课程,主要研究如何用近似方法解决各种数学问题。丁丽娟教授的这本教材深入浅出地介绍了数值计算的基本概念、理论和算法,旨在帮助学生掌握实际计算中的技巧与...

    结构振动与动态子结构方法

    动态子结构方法是解决复杂工程结构动态分析的一种高效手段,特别是在处理大型结构振动问题时。这类方法通过对结构进行子结构划分,可以显著减少计算量和复杂度,便于处理大规模的结构系统。 结构振动学的基本原理...

    【小红书】2024小红书餐饮行业方法论报告.pdf

    【小红书】2024小红书餐饮行业方法论报告.pdf【小红书】2024小红书餐饮行业方法论报告.pdf【小红书】2024小红书餐饮行业方法论报告.pdf【小红书】2024小红书餐饮行业方法论报告.pdf【小红书】2024小红书餐饮行业方法...

    数值计算方法(第二版)PPT教案(马东升)

    《数值计算方法(第二版)》是由马东升教授编撰的一部深入讲解数值计算理论与实践的教程,涵盖了从基础到高级的多种数值计算技术。该教程共分为七章,每章都针对一个核心主题进行详尽阐述,旨在帮助学习者掌握数值...

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

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

    软件测试方法和技术.zip

    "软件测试方法和技术.zip"这个压缩包很可能包含了一系列关于软件测试的详细资料,涵盖了多种测试方法和技术。以下是对这些关键概念的深入解释。 1. **黑盒测试**:这是一种不考虑内部结构或工作原理,仅关注软件...

    数值方法和matlab实现与应用 PDF

    《数值方法和MATLAB实现与应用》是一本深入探讨数值计算技术及其在MATLAB环境中的实际应用的专业书籍。这本书旨在帮助读者理解并掌握各种数值计算方法,并通过MATLAB这一强大的科学计算工具进行实践操作。 首先,...

    数据异常剔除方法

    本文将详细讨论几种常见的异常剔除方法,并介绍基于不同原理的异常点检测算法。 首先,拉依达方法是异常值检测的简单准则,它基于正态分布假设。如果一个数据点超过平均值加减3倍标准差的范围,根据正态分布的性质...

    计算机数值方法施吉林第三版实验

    计算机数值方法是计算机科学与工程领域中至关重要的一个分支,它主要研究如何用近似算法解决数学中的问题,尤其在无法获得精确解析解或者解析解过于复杂时。施吉林教授的《计算机数值方法》第三版是一本广泛使用的...

Global site tag (gtag.js) - Google Analytics