当前位置: 首页 > news >正文

成都网站建设新闻网络销售有哪些模式

成都网站建设新闻,网络销售有哪些模式,学校网站 aspx源码,工程建设概况十六、枚举16.1 背景16.2 枚举类型16.3 EnumSet 和 EnumMap01、EnumSet02、EnumMap16.1 背景 在 Java 语言中还没有引入枚举类型之前,表示枚举类型的常用模式是声明一组 int 类型的常量,常常用的就是: public static final int SPRING 1; …

十六、枚举

  • 16.1 背景
  • 16.2 枚举类型
  • 16.3 EnumSet 和 EnumMap
    • 01、EnumSet
    • 02、EnumMap

16.1 背景

在 Java 语言中还没有引入枚举类型之前,表示枚举类型的常用模式是声明一组 int 类型的常量,常常用的就是:

public static final int SPRING = 1;
public static final int SUMMER = 2;
public static final int AUTUMN = 3;
public static final int WINTER = 4;

看似这样写是没有问题的,但是我们写代码的时候通常都会考虑到它的安全性、易用性和可读性。

首先是安全性。显然,这种模式并不是安全的。就拿上面的例子来说,我们根本无法保证传入值的合法性,在编译期和运行期不知道可能会出现什么情况,这就不符合 Java 程序的类型安全了。

其次是可读性。使用枚举类型的大多数场合都是为了方便得到枚举类型的描述(也就是字符串表达式),如果我们只是单一的打印出来这一组数字,也没有太大的用处。这时如果使用 String 来替代 int 作为常量,也不是不可以的,但是可能会导致性能问题,因为它依赖于字符串的比较操作。

从类型安全和程序可读性两方面考虑,int 和 String 枚举模式的缺点就暴露出来了。这时就引入了一个新的解决方案,就是枚举类型(enum type)

16.2 枚举类型

枚举(enum)是 Java 1.5 时引入的关键字,它标识一种特殊类型的类,继承自 java.lang.Enum,由一组固定的常量组成合法的类型。

新建一个枚举类 Season.java:

/*** 季节枚举类** @author qiaohaojie* @date 2023/3/22  14:07*/
public enum Season {SPRING(1),SUMMER(2),AUTUMN(3),WINTER(4);private int code;Season(int code) {this.code = code;}public int getCode() {return code;}
}

其实在这个类中,我们并没有看到有继承关系的,来扒一下反编译后的字节码:

public final class Season extends Enum
{public static Season [] values(){return (Season [])$VALUES.clone();}public static Season valueOf(String name){return (Season )Enum.valueOf(com/qhj/enumtype/Season, name);}private Season(String s, int i){super(s, i);}public static final int SPRING;public static final int SUMMER;public static final int AUTUMN;public static final int WINTER;private static final Season $VALUES[];static {SPRING= new Season ("SPRING", 0);SUMMER= new Season ("SUMMER", 1);AUTUMN= new Season ("AUTUMN", 2);WINTER= new Season ("WINTER", 3);$VALUES = (new Season[] {SPRING, SUMMER, AUTUMN, WINTER});}
}

Java 编译器帮我们做了很多隐式的工作:

  1. 要继承 Enum 类;
  2. 要写构造方法;
  3. 要声明静态变量和数组;
  4. 要用 static 块来初始化静态变量和数组;
  5. 要提供静态方法,比如 values() 和 valueOf(String name)。

作为开发者,我们的代码量减少了,枚举看起来简洁明了。

既然枚举是一种特殊的类,那么它其实是可以定义在一个类的内部的,这样它的作用域就可以限定于这个外部类中使用:

/*** 枚举定义在外部类中** @author qiaohaojie* @date 2023/3/22  22:28*/
public class SeasonClass {private Season season;public enum Season {SPRING(1),SUMMER(2),AUTUMN(3),WINTER(4);private int code;Season(int code) {this.code = code;}public int getCode() {return code;}}public boolean isSeason() {return getSeason() == Season.AUTUMN;}public Season getSeason() {return season;}public void setSeason(Season season) {this.season = season;}
}

Season 就相当于 SeasonClass 的内部类。

由于枚举是 final 的,所以可以确保在 Java 虚拟机中仅有一个常量对象,基于这个原因,我们可以使用 “==” 运算符来比较两个枚举是否相等,比如上面的 isSeason() 方法。

至于为什么不用 equals() 方法呢?

  1. 首先,“==” 运算符比较的时候,如果两个对象都为 null,并不会发生 NullPointerException,而 equals() 方法就会发生。
    在这里插入图片描述

  2. 另外,“==” 运算符会在编译时进行检查,如果两侧的类型不匹配,就会提示错误,而 equals() 方法则不会:在这里插入图片描述

另外,枚举还可以用于 switch 语句,和基本数据类型的用法一致:

public static String getChineseSeason(Season season) {StringBuffer result = new StringBuffer();switch (season) {case SPRING:result.append("[中文:春天,枚举常量:" + season.name() + ",数据:" + season.getCode() + "]");break;case SUMMER:result.append("[中文:夏天,枚举常量:" + season.name() + ",数据:" + season.getCode() + "]");break;case AUTUMN:result.append("[中文:秋天,枚举常量:" + season.name() + ",数据:" + season.getCode() + "]");break;case WINTER:result.append("[中文:冬天,枚举常量:" + season.name() + ",数据:" + season.getCode() + "]");break;}

如果枚举中需要包含更多信息的话,可以为其添加一些字段,比如:code、name 等,这时就需要为枚举添加一个带参的构造方法,这样就可以在定义枚举时添加对应的名称了。

16.3 EnumSet 和 EnumMap

01、EnumSet

EnumSet 是一个专门针对枚举类型的 Set 接口的实现类,它是处理枚举类型数据的一把利器,非常高效的。从名字上也可以看得出,EnumSet 不仅和 Set 有关系,也和枚举有关系。

因为 EnumSet 是一个抽象类,所以创建 EnumSet 时不能使用 new 关键字,但是 EnumSet 提供了很多有用的静态工厂方法。

举个例子,我们可以使用 noneOf) 静态工厂方法创建一个空的 Season 类型的 EnumSet;使用 allOf() 静态工厂方法创建一个包含所有 Season 类型的 EnumSet:

/*** @author qiaohaojie* @date 2023/3/22  22:41*/
public class SeasonClassTest {public static void main(String[] args) {EnumSet<Season> enumSetNone = EnumSet.noneOf(Season.class);System.out.println(enumSetNone); // []EnumSet<Season> enumSetAll = EnumSet.allOf(Season.class);System.out.println(enumSetAll); // [SPRING, SUMMER, AUTUMN, WINTER]}
}

有了 EnumSet 后,就可以使用 Set 的一些方法了:
在这里插入图片描述

02、EnumMap

EnumMap 是一个专门针对枚举类型的 Map 接口的实现类,它可以将枚举常量作为键来使用。EnumMap 的效率甚至比 HashMap 还要高,可以直接通过数组下标(枚举的 ordinal 值)访问到元素。

与 EnumSet 不同的是,EnuMap 不是一个抽象类,所以创建 EnumMap 时可以使用 new 关键字:

/*** @author qiaohaojie* @date 2023/3/22  22:41*/
public class SeasonClassTest {public static void main(String[] args) {EnumMap<Season, String> enumMap = new EnumMap<Season, String>(Season.class);enumMap.put(Season.SPRING, "春天");enumMap.put(Season.SUMMER, "夏天");enumMap.put(Season.AUTUMN, "秋天");enumMap.put(Season.WINTER, "冬天");System.out.println(enumMap); // {SPRING=春天, SUMMER=夏天, AUTUMN=秋天, WINTER=冬天}}
}
http://www.yayakq.cn/news/806593/

相关文章:

  • 深圳市做网站的有那些公司淄博网站建设哪家好
  • 自己做首饰的好网站临沂做过网站的公司
  • 网站 关于我们 模板珠海哪个公司建设网站好
  • 汉字域名的网站淄博做网站优化
  • 网站备案是自己可以做吗乐视网站建设目标
  • 网站怎么做营销门户网站建设价格
  • 网站改造萍乡专业的企业网站建设公司
  • 东莞企业网站制作怎么做如何修改网站后台密码
  • 帮公司制作一个网站是如何收费wordpress的时间
  • 怎么建设手机网站wordpress 有没有上级目录的写权限
  • 备案ip 查询网站查询网站wordpress速度优化
  • 优质网站建设的设计要点二维码生成器软件下载
  • 网站做的比较好的网络营销思路
  • 做国际网站的上海高端网站公司番禺附近网站建设推广
  • 双语网站后台怎么做网站信息内容建设
  • 湛江手机网站制作seo软件服务
  • 外贸公司没网站磁力宝最佳搜索引擎入口
  • 网站建设神州互动郑州市金水区建设局网站
  • 公司做网站计入什么科目如果做网站接口
  • 做网站的是如何赚钱的淮南网云小镇房价
  • 河北省住房和建设厅网站wordpress教学视屏
  • 网站建设文化报价服装线上结合线下的推广方案
  • 大型网站许多网站网站注册域名免费
  • 北京集团网站建设软文推广网
  • php做的网站有虚拟主机评测
  • 营销型企业网站的建设步骤开发制作app软件
  • 济南正宗网站建设报价用vs2012做简单网站
  • 2017网站seo如何做服务网络是什么
  • 南昌的网站推广公司打开秒开小游戏
  • 企业门户网站设计建设与维护肇庆建设网站