java中枚举的常见用法

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();
原文地址:https://www.cnblogs.com/dw3306/p/13215491.html