加入收藏 | 设为首页 | 会员中心 | 我要投稿 宿州站长网 (https://www.0557zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

Java设计和达成方法

发布时间:2021-12-05 13:16:08 所属栏目:教程 来源:互联网
导读:方法签名 方法名是驼峰命名 方法名最好能说明该方法主要做什么 方法参数的名字最好能说明该参数的意义 方法参数个数最好低于6个 例如: public void setTitleVisible(int length, String title, boolean visible ) { //some implementation here } Java5引入

方法签名
 
 
方法名是驼峰命名
 
方法名最好能说明该方法主要做什么
 
方法参数的名字最好能说明该参数的意义
 
方法参数个数最好低于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值
 
不管什么时候,尝试涉及不变的方法

(编辑:宿州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章