java中枚举的常见用法
概念:
首先枚举是一个特殊的class,所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类
他的构造方法强制被私有化。每个枚举变量都是枚举类的实例,每个成员变量都是final static修饰
一、枚举型常量
public enum ColorEnum { //每个枚举变量都是枚举类ColorEnum的实例,相当于RED=new ColorEnum(1),按序号来。 //每个成员变量都是final static修饰 RED, GREEN, BLANK, YELLOW; }
二、带一个参数的枚举
public enum TypeEnum { FIREWALL("firewall"), SECRET("secretMac"), BALANCE("f5"); private String typeName; TypeEnum(String typeName) { this.typeName = typeName; } /** * 根据类型的名称,返回类型的枚举实例。 * * @param typeName 类型名称 */ public static TypeEnum fromTypeName(String typeName) { for (TypeEnum type : TypeEnum.values()) { if (type.getTypeName().equals(typeName)) { return type; } } return null; } public String getTypeName() { return this.typeName; } }
eg: // 根据不同登录用户类型查询用户的角色信息 switch (UserTypeEnum.getUserType(userType)) { case HOST_ENTERPRISE: // 查询主办企业用户角色 break; case EMPLOYEE: // 查询 平台员工角色 break; case MOVE_IN_BUSINESS: // 查询 入住企业用户角色 break; default: // .... break; }
三、Java枚举实现接口
为什么要通过枚举实现接口呢?考虑如下需求:
1.我希望通过接口定义API
2.我希望接口的实现类有限,并且每个实现类都只需要一个实例
此时,可以利用枚举类型实例受限的特效,通过枚举实现接口,从而达到我们的需求。
eg:如下根据不同位置选择不同的方法打水印:
interface
public interface IGetWatermarkImage { /** * 水印的字体 */ String FONT = "YouYuan"; /** * 水印字体大小 */ Integer FONT_SIZE = 30; /** * 水印图片的固定高度 */ Integer WATERMARK_IMAGE_HEIGHT = 140; /** * 水印文字的行间距离 */ Integer WATERMARK_LINE_HEIGHT = 20; /** * 获取一张水印图片 * @param watermarkColor 水印的颜色 * @param watermarkMessages 水印的内容 * @param orgBufferImage 需要打水印的原图片 * @return */ BufferedImage getWatermarkImage(String watermarkColor, ArrayList<String> watermarkMessages, BufferedImage orgBufferImage); }
public enum PositionEnum implements IGetWatermarkImage { // {1:'底部居中',2:'底部靠左',3:'底部靠右',4:'顶部居中',5:'顶部靠左',6:'顶部靠右'} BOTTOM_CENTER(1) { @Override public BufferedImage getWatermarkImage(String watermarkColor, ArrayList<String> watermarkMessages, BufferedImage orgBufferImage) { int orgImageWidth = orgBufferImage.getWidth(); int orImageHeight = orgBufferImage.getHeight(); BufferedImage bufferedImage = new BufferedImage(orgImageWidth, WATERMARK_IMAGE_HEIGHT, BufferedImage.TYPE_INT_RGB); BufferedImageGraphicsConfig config = BufferedImageGraphicsConfig.getConfig(bufferedImage); bufferedImage =config.createCompatibleImage(orgImageWidth, WATERMARK_IMAGE_HEIGHT, Transparency.TRANSLUCENT); Graphics2D graphics2D = bufferedImage.createGraphics(); /* 消除java.awt.Font字体的锯齿 */ graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); graphics2D.setColor(getColorByColorStr(watermarkColor)); //设置文字的颜色 Font font = new Font(FONT, Font.BOLD, FONT_SIZE); graphics2D.setFont(font); // 水印文字的高度 int watermarkMessageHeight = getStringHeight(graphics2D); // 计算水印文字的总高度 int totalHeight = watermarkMessageHeight * (watermarkMessages.size()); // 水印Y轴的开始位置 int startIndexY = (WATERMARK_IMAGE_HEIGHT - totalHeight) / 2; for (int i = 0; i < watermarkMessages.size(); i++) { String watermarkMessage = watermarkMessages.get(i); int watermarkLength = getWatermarkLength(watermarkMessage, graphics2D); // 水印文字的X轴位置 int startIndexX = (orgImageWidth - watermarkLength) / 2; startIndexY = startIndexY + watermarkMessageHeight; graphics2D.drawString(watermarkMessage, startIndexX, startIndexY); } graphics2D.dispose(); // 开始打水印 Graphics2D graphics = orgBufferImage.createGraphics(); graphics.drawImage(bufferedImage, 0, orImageHeight - WATERMARK_IMAGE_HEIGHT, null); graphics.dispose(); return orgBufferImage; } }, BOTTOM_LEFT(2) { @Override public BufferedImage getWatermarkImage(String watermarkColor, ArrayList<String> watermarkMessages, BufferedImage orgBufferImage) { return null; } }, BOTTOM_RIGHT(3) { @Override public BufferedImage getWatermarkImage(String watermarkColor, ArrayList<String> watermarkMessages, BufferedImage orgBufferImage) { return null; } }, TOP_CENTER(4) { @Override public BufferedImage getWatermarkImage(String watermarkColor, ArrayList<String> watermarkMessages, BufferedImage orgBufferImage) { return null; } }, TOP_LEFT(5) { @Override public BufferedImage getWatermarkImage(String watermarkColor, ArrayList<String> watermarkMessages, BufferedImage orgBufferImage) { return null; } }, TOP_RIGHT(6) { @Override public BufferedImage getWatermarkImage(String watermarkColor, ArrayList<String> watermarkMessages, BufferedImage orgBufferImage) { return null; } }; PositionEnum(Integer choosePosition) { this.choosePosition = choosePosition; } private Integer choosePosition; public static PositionEnum getPositionEnum(Integer choosePosition) { for (PositionEnum positionEnum : PositionEnum.values()) { if (choosePosition == positionEnum.getChoosePosition()) { return positionEnum; } } return null; } public Integer getChoosePosition() { return choosePosition; } public void setChoosePosition(Integer choosePosition) { this.choosePosition = choosePosition; } }
使用:
PositionEnum positionEnum = PositionEnum.getPositionEnum(1);
positionEnum.getWatermarkImage();