zoukankan      html  css  js  c++  java
  • 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值

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

  • 相关阅读:
    gitlab详解
    Centos7源码安装MySQL5.7
    git常用语句
    jenkins的Pipeline代码流水线管理
    jenkins配置Maven的私有仓库Nexus
    jenkins按角色授权
    jenkins集群节点构建maven(几乎是坑最多的)
    jenkins按版本发布maven项目
    jenkins发布java项目
    实现拷贝函数(strcpy)
  • 原文地址:https://www.cnblogs.com/yandufeng/p/5201321.html
Copyright © 2011-2022 走看看