设为首页 加入收藏

TOP

Java设计和实现方法(一)
2019-01-31 02:08:28 】 浏览:153
Tags: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 Illeg
编程开发网

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Java中创建线程的三种方式以及区别 下一篇Python中round函数使用注意事项