入参限定方法一:枚举
enum Season1{
Spring,
Summer,
Autumn,
Winter
}
将枚举类型做为入参的类型,这样就可以起到限制入参类型的作用
public void methodName(Season season){}
这个方法对于开发者来说更常见,但是占用的内存比较大,这里做了一个简单的测试,看一下内存的占用情况。
使用枚举类型
public class Season2{
enum Season{
Spring,
Summer,
Autumn,
Winter
}
}
占用大概1.02KB
使用枚举类
public enum Season{
Spring, Summer, Autumn, Winter
}
占用大概854B
入参限定方法二:注解
//限定值只能是SPRING,SUMMER,AUTUMN和WINTER
@IntDef({Season.SPRING,
Season.SUMMER,
Season.AUTUMN,
Season.WINTER})
//定义当前@IntDef注解的保留策略,
//RetentionPolicy.SOURCE 表示此注解只会保留在源码中,编译时删除,不会保留到.class里面
@Retention(RetentionPolicy.SOURCE)
//定义注解可以使用的场景
//ElementType.PARAMETER 表示只能给形参注解
@Target(ElementType.PARAMETER)
//自定义一个注解接口
@interface Season{
int SPRING = 0;
int SUMMER = 1;
int AUTUMN = 2;
int WINTER = 3;
}
将枚举类型做为入参的类型,这样也可以起到限制入参类型的作用
public void methodName(@Season int season){}
注解相对于枚举来说比较冷门,但是对空间的占用更小了,是一种优化内存空间的方向
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
public class Season3{
@IntDef({Season.SPRING,
Season.SUMMER,
Season.AUTUMN,
Season.WINTER})
@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.PARAMETER)
@interface Season{
int SPRING = 0;
int SUMMER = 1;
int AUTUMN = 2;
int WINTER = 3;
}
@Retention(RetentionPolicy.SOURCE)
@Target({ElementType.ANNOTATION_TYPE})
public @interface IntDef {
int[] value() default {};
boolean flag() default false;
}
}
内存占用大概588B
在最后,我又试了一下直接定义int类型的常量,看看内存情况吧
public class Season1{
public static final int Spring = 0;
public static final int Summer = 1;
public static final int Autumn = 2;
public static final int Winter = 3;
}
内存占用大概328B
所以大家会怎么选择呢?