当前位置: 首页 > news >正文

Java设计和实现方法

方法签名

方法名是驼峰命名

方法名最好能说明该方法主要做什么

方法参数的名字最好能说明该参数的意义

方法参数个数最好低于6个

例如:

public void setTitleVisible(int length, String title, boolean visible ) {
    //some implementation here      
}

java5引入了相同类型的可变参数(不定项参数)

例如:

public void find(String ... elements) {
    //some implementation here   
}

 

 在内部,java编译器将可变参数转化为数组

java5也允许可变参数为泛型,但是参数的类型不可知,java编译器为了确保参数被合理使用,建议方法声明为final,并且用@SafeVarargs注解。

例如:

@SafeVarargs
final public<T> void find(T ... elements) {
    //some implementation here
}

 

另外一种方法

@SuppressWarnings("unchecked")
public<T> void findSuppressed(T ... elements) {
    //some implementation here
}

 

下面展示方法签名中checked exceptions的使用,但是最近几年证实,它并没有如期望那样使用。

public void write(File file) throws IOException {
    //some implementation here
}

 

最好标记方法参数为final,还有这种类型的方法参数可以被匿名方法访问。

 

方法体

最重要的一个原则:一个方法最好只实现一个功能

另一个原则:方法实现体最好比较短,一个屏幕一定要能看完

在方法体中,最好减少return语句的数量。建议仅仅只有一个return语句

 

方法重载

public String numberToString(Long number) {
    return Long.toString(number);
}
public String numberToString(BigDecimal number) {
    return number.toString();
}

 

方法重载有点像泛型,但是泛型有一些地方工作不太好的地方,方法重载可以很好的工作。

泛型和方法重载结合可以变得很强大,但是在java中并不经常使用。

例如:

public<T extends Number> String numberToString(T number) {
    return number.toString();
}

public String numberToString(BigDecimal number) {
    return number.toPlainString();
}

 

 

方法重写

public class Parent {
    public Object toObject(Number number) {
        return number.toString();
    }
}

public class Child extends Parent {
    @Override
    public String toObject(Number number) {
        return number.toString();
    }
}

 

在子类中返回参数被改变啦,但是编译器是可以通过的。但是子类返回的参数类型必须是父类返回的参数类型的子类。

现在我们添加一个方法:

public class Child extends Parent {
    public String toObject(Double number) {
        return number.toString();
    }
}

 

方法签名中(Double代替Number),但是在这种情况下,这是方法重载,并不是方法重写。

 

递归

例如:

public int sum(int[] numbers) {
    if (numbers.length == 0) {
        return 0;
    } else if (numbers.length == 1) {
        return numbers[0];
    } else {
        return numbers[0] + sum(Arrays.copyOfRange(numbers, 1, 
            numbers.length));
    }
}

 

上诉方法并不是有效的实现方法,但是却很好的展示了递归。

递归存在这一个著名的问题,这个问题依赖于调用链有多深,这样会放大栈,引起StackOverflowError异常,但是事情并不总是那么坏,有一种技术可以避免stack overflows,叫做tail call optimization。如果方法是tail-recursive方法,那么这种技术会被应用。

例如:

public int sum(int initial, int[] numbers) {
    if (numbers.length == 0) {
        return initial;
    } else if (numbers.length == 1) {
        return initial + numbers[0];
    } else {
        return sum(initial + numbers[0],
            Arrays.copyOfRange(numbers, 1, numbers.lenght));
    }
}

 

不幸的是,现在java编译器(还有JVM JIT编译器)并不支持tail call optimization,但是仍然需要了解这种技术,当在java中写递归的时候,需要考虑。

 

文档方法

 

方法参数和返回值

文档化你的方法是很好的形式,但是并不能阻止用户输入错误的方法参数,所以,所有的公共方法都需要进行参数的验证,并不能相信用户总是输入正确的数据。

例如:

public int parse(String str) throws NumberFormatException {
    if (null == str) {
        throw new IllegalArgumentException("String should not be null");
    }
    
    return Integer.parseInt(str);
}

 

在java8之前,在方法调用中,如果本次调用没有返回值,则返回null,这就是为什么Java会经常抛出NullPointerException异常,Java8使用Option<T>解决该问题。

 

方法作为API注意事项

使用有意义的方法名和方法参数

保持方法参数个数低于6

保持你的方法少,具有可读性

总是文档化你的公共方法,包括先决条件,例子

总是进行参数验证和sanity check

最好不要返回null值

不管什么时候,尝试涉及不变的方法

转载于:https://www.cnblogs.com/yandufeng/p/5201321.html

相关文章:

  • GitHub-版本控制
  • 安装nginx+lua开发环境
  • POJ2115 C Looooops 模线性方程(扩展欧几里得)
  • 矩阵快速幂,简单粗暴
  • Mysql----浅入浅出之视图、存储过程、触发器
  • 当前端也拥有 Server 的能力
  • GridView中使用 jQuery DatePicker (UpdatePanel)
  • 39.Android版本小知识
  • 适合初学者的理解Sphinx运行方式
  • java--- Map详解
  • springMVC-mvc:annotation-driven
  • MyCat源码分析系列之——BufferPool与缓存机制
  • web项目中各种路径的获取
  • hdu 1081 dp问题:最大子矩阵和
  • ssh 命令
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • C学习-枚举(九)
  • js学习笔记
  • mysql常用命令汇总
  • oschina
  • Python中eval与exec的使用及区别
  • SpiderData 2019年2月13日 DApp数据排行榜
  • windows-nginx-https-本地配置
  • 关于字符编码你应该知道的事情
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 思否第一天
  • 智能网联汽车信息安全
  • 06-01 点餐小程序前台界面搭建
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • ​Python 3 新特性:类型注解
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • (1)(1.13) SiK无线电高级配置(五)
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (二)springcloud实战之config配置中心
  • (附源码)springboot车辆管理系统 毕业设计 031034
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (四)c52学习之旅-流水LED灯
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .NET 材料检测系统崩溃分析
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .NET 药厂业务系统 CPU爆高分析
  • .NET框架
  • .NET运行机制
  • @Conditional注解详解
  • @reference注解_Dubbo配置参考手册之dubbo:reference
  • @requestBody写与不写的情况
  • [ 第一章] JavaScript 简史
  • [ 数据结构 - C++] AVL树原理及实现
  • [AIGC] Spring Interceptor 拦截器详解
  • [autojs]逍遥模拟器和vscode对接