读书笔记--编写高质量代码 改善java程序的151个建议(六)枚举与注解

读书笔记--编写高质量代码 改善java程序的151个建议(六)枚举与注解

使用枚举定义常量

使用枚举定义常量相对来说更简单,而且枚举常量的个数是确定的不用担心越界啊或者其他字符串判断等问题。每个自定义的枚举类型都是Enum的子类,所以都继承了Enum定义的方法,用起来很方便,除了Enum定义的方法外编译器在编译自定义枚举的时候还会追加静态方法values和valueof(这个方法和Enum的方法不一样)

使用构造函数来增强枚举能力

enum Light {
       // 利用构造函数传参
       RED (1), GREEN (3), YELLOW (2);

       // 定义私有变量
       private int nCode ;

       // 构造函数,枚举类型只能为私有
       private Light( int _nCode) {
           this . nCode = _nCode;
       }

       @Override
       public String toString() {
           return String.valueOf ( this . nCode );
       }
    }

枚举其实就是一个继承自Enum的class,所以可以有构造函数,成员变量和方法。 在用switch判断枚举类型的时候,要注意防范空值,因为switch在比较枚举类型的时候用的是排序值,用null来调用ordinal()方法当然报错了。

用枚举实现工厂模式

工厂模式源代码:

public class Client {
    public static void main(String[] args) {
        //生产车辆
        Car car = CarFactory.createCar(Car.class);
    }
}

//抽象产品
interface Car {
};
//具体产品类
class FordCar implements Car {
};
//具体产品类
class BuickCar implements Car {
};
//工厂类
class CarFactory {
    //生产汽车
    public static Car createCar(Class<? extends Car> c) {
        try {
            return (Car) c.newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

枚举非静态方法实现工厂模式

public class Client {
    public static void main(String[] args) {
        //生产汽车
        Car car = CarFactory.BuickCar.create();
    }
}

interface Car {
};

class FordCar implements Car {
};

class BuickCar implements Car {
};

enum CarFactory {
    //定义工厂类能生产汽车的类型
    FordCar, BuickCar;
    //生产汽车
    public Car create() {
        switch (this) {
        case FordCar:
            return new FordCar();
        case BuickCar:
            return new BuickCar();
        default:
            throw new AssertionError("无效参数");
        }
    }
}

通用抽象方法实现

public class Client {
    public static void main(String[] args) {
        Car car = CarFactory.BuickCar.create();
    }
}

interface Car {
};

class FordCar implements Car {
};

class BuickCar implements Car {
};

enum CarFactory {
    FordCar {
        public Car create() {
            return new FordCar();
        }
    },
    BuickCar {
        public Car create() {
            return new BuickCar();
        }
    };
    //抽象生产方法
    public abstract Car create();
}

如果大家看过之前的博文应该能明白这里实现抽象方法的过程。 用枚举实现工厂方法的好处就不多说了,性能啊 解耦啊,防御编程啊等等。记得下次要用枚举来实现工厂模式。

为了枚举的性能,尽量保证数量在64以内

枚举的底层实现是以一个long为单位,将枚举排序值映射到long的64上,所以如果超出了64的话,java会把枚举包装成一个long64位组成的枚举的数组上,这样子性能就会下降。

尽量别用注解@Inherited

@Inherited注解用在父类上表示其任何子类都继承次注解属性,这样子在阅读子类代码的时候很迷惑,很难发现bug。建议不要使用。估计用的人也不多吧?我第一次听说。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值