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值 不管什么时候,尝试涉及不变的方法 (编辑:宿州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐