- 浏览: 52990 次
- 性别:
- 来自: 佛山
最新评论
文章列表
7.38 验证输入参数
- 博客分类:
- Effective Java
基本原则:
1.尽可能早的校验输入参数的有效性,如在方法的第一行代码进行校验,以尽早的发现错误。
2.对于公共方法,如果校验失败应抛出异常,对于私有方法,建议使用assert关键字进行校验。在编译源码时,必须添加-ea参数,assert校验逻辑才能生效(对使用assert持保留意见)
3.使用注释详细说明方法的输入参数的有效性,以及如果校验失败,对应抛出的异常类型
基本原则:
1.总是使用@Override标记被覆盖的方法,@Override可以在编译时检查是否正确的覆盖方法,以便及时发现错误。如果你的类是非抽象的,并且继承了抽象类或实现了接口,仍然建议使用@Override注释
2.标记(marker)接口指不包含任何方法的接口,如Serializable,Set。如果需要限制方法的参数类型,或者减小接口范围(如Set接口继承Collection接口,Set减小了Collection的接口范围),那么应该使用标记接口
3.如果你的框架已经大量使用了Annotation。或者需要标记除类和接口外的目标(如方法),或者需要在未来增加更多的 ...
一般测试框架类,如JUnit,TestNG都可以通过设置指定具有某些名称的方法为测试方法,如以test开头的方法为测试方法,这样做的缺点包括:
1.如果方法名称拼写错误,不会有任何提示。如误拼为tsetHello(),测试时此方法不会被执行,但是也不会有任何错误提示
2.可能误执行其他方法,如testSafety()可能是业务方法,但因为符合测试方法的命名模式(以test开头的方法),所以在测试时会被调用
3.不能传递输入参数值给测试方法
使用Annotation可以避免以上问题,如以下使用方式:
//使用@Test标记测试方法
@Test
pub ...
枚举类不能继承其它类,但是枚举类可以继承接口,如下接口:
public interface Operation {
double apply(double x,double y);
}
BaseOperation、ExtendedOperation实现了此接口:
public enum BaseOperation implements Operation {
PLUS("+") {
public double apply(double x, double y) {
return x + y;
}
},
MINUS(" ...
假设有如下类Food(食物),枚举类Type定义Food的类型:
public class Food {
public enum Type{FRUIT,VEGETABLE}
private final Type type;
private final String name;
public Food(String name,Type type){
this.name=name;
this.type=type;
}
public String getName(){
return name;
}
public Type ...
假设Text类是一个UI控件,此控件可以设置各种样式(Style)。一般情况下会使用int类型的常量定义各种样式,以便可以进行bit运算,如下:
public class Text {
//样式定义
public static final int STYLE_BOLD=1<<0;//1
public static final int STYLE_ITALIC=1<<1;//2
public static final int STYLE_UNDERLINE=1<<2;//4
//应用样式
public void applySty ...
枚举类的ordinal()用于返回枚举量的序数,根据API说明,此方法仅应该被EnumSet,EnumMap使用。所以不要使用如下代码:
public enum State {
ON,OFF;
public int numberOfState(){
//never do this;
return ordinal()+1;
}
}
可以使用成员属性存储序列号,修改后的代码如下:
public enum State {
ON(1),OFF(2);
private final int number;
private State(int n ...
6.30 使用枚举类代替常量
- 博客分类:
- Effective Java
JDK5开始支持枚举功能,以下枚举类:
public enum State {
ON,OFF;
}
枚举类State不能继承其它类,也不能被其它类继承,并且不能使用new创建State类型的对象。其实State可视为java.lang.Enum的子类,其中每一个枚举常量可视为State类型的实例,以下代码仅供理解:
public class State {
public static final State ON=new State();
public static final State OFF=new State();
private ...
5.26-5.29 使用泛型
- 博客分类:
- Effective Java
以下类使用了泛型:
public class Container <E>{
private List<E> elements=new ArrayList<E>();
public void addAll(List<E> list){
elements.addAll(list);
}
public void removeAll(List<E> list){
list.addAll(elements);
elements.clear();
}
public static &l ...
List<E>与Array的区别:
1.如果Child是Parent的子类,那么Child[]是Parent[]的子类型,而List<Child>与List<Parent>没有继承关系
2.Array在运行时检查存放在同一个数组里的元素必须是同一类型,List<E>是在编译时检查元素类型,在运行时泛型类型被擦除
以下代码说明以上两点:
//因为Long是Object的子类,所以以下可以通过编译
Object[] array=new Long[1];
//在运行时检查类型,以下代码会报错
array[0]="b ...
5.24 消除未检查的警告
- 博客分类:
- Effective Java
以下代码在编译时将给出一个未检查的警告(unchecked warning):
//警告信息提示ArrayList应使用泛型
List<String> list=new ArrayList();
任何一个未检查的警告在运行时都可能导致抛出ClassCastException,因此应该尽量消除警告信息,如上代码应修改为:
List<String> list=new ArrayList<String>();
如果确定代码不会触发ClassCastException,那么可以使用@SuppressWarnings("unchecke ...
JDK5引入了泛型,在新代码里应优先使用泛型替代原始类型(raw type)
泛型相关术语:
List<E>
generic type
泛型
E
formal type parameter
形式参数
List<String>
parameterized type
参数化类型
String
actual type parameter
实际参数
List
raw type
原始类型
List<?>
unbounded wildcard type
4.22 嵌套类
- 博客分类:
- Effective Java
嵌套类包括:
1.静态成员嵌套类:可视为外部类的静态方法,可访问外部类的静态属性和方法。
2.成员嵌套类:可视为外部类的成员方法,可访问外部类的所有成员属性和方法。成员嵌套类的对象一定会和外部类的对象关联,如下两者将关联在一起(成员嵌套类可通过Outer.this访问所关联的外部类对象):
Outer.Inner inner=new Outer().new Inner();
3.匿名嵌套类:可视为外部类的局部变量,可访问外部类的所有成员属性和方法,以及使用final修饰的局部变量
4.局部嵌套类:同匿名嵌套类
使用原则:
1.如果嵌套类不需要访 ...
在JavaScript里,可以直接传递函数引用(被传递的函数可视为类型为Function的对象),如下:
function sayHello(){
alert("hello, world!");
}
<input type="button" onclick="sayHello()"/
在Java里,目前应该还不可以这样传递。但是可以使用函数式对象实现类似功能。函数式对象指仅包含一个方法的对象,并且此方法应满足以下条件:
1.在任何情况下,使用相同的输入参数值应返回同一个结果
2.在任何情况下,执行此 ...
本小节请直接参考原文,基本上我还从未遇到类似标签类的写法
标签类:
class TagFigure {
enum Shape {
RECTANGLE, CIRCLE
};
// Tag field - the shape of this figure
final Shape shape;
// These fields are used only if shape is RECTANGLE
double length;
double width;
// This field is used only if shape is CIRCLE
...