enum,EnumMap,EnumSet

作者:网络    软件教程库   2020-05-20

enum基本使用


package com.enumtest;

enum shrubbery {
ground, crawling, hanging}

public class enumclass {
public static void main(string[] args) {
for (shrubbery s : shrubbery.values()) {
system.out.println(s + “ordinal:” + s.ordinal());
system.out.println(s.compareto(shrubbery.crawling) + “”);
system.out.println(s.equals(shrubbery.crawling) + “”);
system.out.println(s == shrubbery.crawling);
system.out.println(“s.getdeclaringclass:” + s.getdeclaringclass()
+ “getclass:” + s.getclass());
system.out.println(s.name());
system.out.println(“——————————-“);
}
string[] arraystring=”hanging crawling ground”.split(” “);
for (string s : arraystring) {
shrubbery shrub = enum.valueof(shrubbery.class, s);
system.out.println(shrub);
}
}
}

  1. 每个enum实例(ground, crawling, hanging)都记录一个次序original(0,1,2).
    2.实现了comparable接口,重写了compareto按照 original来比较次序,且仅运行同一个enum类型实例做比较.
    3.equals 比较内存地址
    4.实现了 serializable接口.

除了少量限制,我们可以把enum当作普通类型对待:
package com.enumtest;

public enum ozwitch {

//you must define enum instances firstly.
west("west"), north("north"), east("east"), south("south");
private string description;

//even if the constructor is public .. , it‘s nonsense!
private ozwitch(string description) {
    this.description = description;
}

public string getdescription() {
    return description;
}

public static void main(string[] args) {
    for (ozwitch witch : ozwitch.values()) {
        system.out.println(witch + ":" + witch.getdescription());

    }
}

}

enum 类型可以用于switch 语句中

.switch(integer or enum){
case ….
}
enum signal {
green, yellow, red
}

public class trafficlight {
signal color = signal.red;

public void change() {
    switch (color/*枚举实例*/) {
    //case ** 被强制用color类型的实例
    case red:
        color = signal.green;
        break;
    case green:
        color = signal.yellow;
        break;
    case yellow:
        color = signal.red;
        break;
    }
}
public string tostring() {
    return "the traffic light is " + color;
}

public static void main(string[] args) {
    trafficlight t = new trafficlight();
    for (int i = 0; i  7; i++) {
        system.out.println(t);
        t.change();
    }
}

}

关键字 enum 与 java.lang.enum 的区别:
我们看以下代码:

enum explore { here, there }

public class reflection {
public static set analyze(class

package com.enumtest;
//枚举中的枚举
public enum course {
//定义三个枚举实例
appetizer(food.appetizer.class),
maincourse(food.maincourse.class),
coffee(food.coffee.class);
//定一个域 用来得到 每个实例中包含的实例
private food[] allfood;

//构造器获得一个枚举类型中的所有实例  
//这个构造器 ,通过入参获取该入参对应的所有实例
course(class extends food clazz) {
    allfood = clazz.getenumconstants();
}
//随机获取一个枚举(如 appetizer)中的枚举实例(如 salad,soup,red_wine)中的一个
public food randomselection() {
    return enums.random(allfood);
}

public static void main(string[] args) {
for (int i = 0; i course.values().length; i++) {
for (course course : course.values()) {
food food = course.randomselection();
system.out.println(food);
}
system.out.println(“———–”);
}
另外,还有一种简洁的组织方式(随便选择一种即可,个人倾向第一种,clear!):

public enum meal2 {
appetizer(food.appetizer.class),
maincourse(food.maincourse.class),
dessert(food.dessert.class),
coffee(food.coffee.class);
private food[] values;
private meal2(class extends food kind) {
736 thinking in java bruce eckel
values = kind.getenumconstants();
}
public interface food {
enum appetizer implements food {
salad, soup, spring_rolls;
}
enum maincourse implements food {
lasagne, burrito, pad_thai,
lentils, hummous, vindaloo;
}
enum dessert implements food {
tiramisu, gelato, black_forest_cake,
fruit, creme_caramel;
}
enum coffee implements food {
black_coffee, decaf_coffee, espresso,
latte, cappuccino, tea, herb_tea;
}
}
public food randomselection() {
return enums.random(values);
}
public static void main(string[] args) {
for(int i = 0; i  5; i++) {
for(meal2 meal : meal2.values()) {
food food = meal.randomselection();
system.out.println(food);
}
system.out.println("---");
}
}
} /* same output as meal.java *///:~

enumset

1.其操作比hashset快,基于long的存储
2.enumset 中的元素 必须是 enum类型,初始化后元素的顺序与enum实例定义顺序一致

import java.util.enumset;

public class enumsets {
    public static void main(string[] args) {
        enumsetalarmpoints points = enumset.noneof(alarmpoints.class);
        points.add(alarmpoints.bathroom);
        system.out.println(points);

        points.addall(enumset.of(alarmpoints.stair1, alarmpoints.stair2,
                alarmpoints.kitchen));
        system.out.println(points);

        points = enumset.allof(alarmpoints.class);
        // points.removeall(enumset.of(alarmpoints.stair1,alarmpoints.stair2,alarmpoints.kitchen));
        system.out.println(points);

        // 参数 rangefrom,rangeto 都包含
        points.removeall(enumset.range(alarmpoints.stair1, alarmpoints.stair2));
        system.out.println(points);

        //求一个差集
        points = enumset.complementof(points);
        system.out.println(points);
    }
}

enumset基于long(64bit)构造, 通过enumset result = noneof(elementtype);初始化,enumset中的元素用一个bit来表示其存在。所以,如果初始化的enum元素个数超过64个则会增加long个数,如果小于64个,则会只有一个long的内存空间。
(如源码: elements 用来存元素)
/**
* bit vector representation of this set. the 2^k bit indicates the
* presence of universe[k] in this set.
*/
private long elements = 0l;

enummap

1.key 必须是一个指定(构造器初始)的enum的实例,内部由数组实现,速度快
2.初始化后元素的顺序与enum实例定义顺序一致,其他操作与map类似
3.实现 多路分发( multiple dispatching)

//命令模式 1.通常有一个仅有一个单一方法的接口
interface command {
    void action();
}

public class enummaps {
    public static void main(string[] args) {
        enummapalarmpoints, command em = new enummapalarmpoints, command(
                alarmpoints.class);

        //em 的键只允许是初始化定义的   alarmpoints.class 的实例
        em.put(alarmpoints.kitchen, new command() {
            // 命令模式 2. 从该接口实现有各自不同行为的 子实现
            @override
            public void action() {
                system.out.println("kitchen fire!");
            }
        });
        em.put(alarmpoints.bathroom, new command() {
            @override
            public void action() {
                system.out.println("bathroom fire!");
            }
        });
        for(map.entryalarmpoints,command e:em.entryset()){
            system.out.println("  e.getkey()  " +e.getkey());
            e.getvalue().action();
        }
        try {
            em.get(alarmpoints.utility).action();
        } catch (exception e ) {
            e .printstacktrace();
        } 
    }
}

常量指定方法 (constantspecific methods)


public enum constantspecificmethod {

    date_time {
        string getinfo() {
            return dateformat.getdateinstance().format(new date());
        }
    },
    classpath {
        string getinfo() {
            return system.getenv("classpath");
        }
    },
    version {
        string getinfo() {
            return system.getproperty("java.version");
        }
    };
    //声明一个抽象方法(或者普通方法——默认行为方法,后边再说)
    abstract string getinfo();

    public static void main(string[] args) {
        for (constantspecificmethod constantspecmethod : values()) {
            system.out.println("\\s"+constantspecmethod.getinfo());
        }
    }

}

这个也称为表驱动的代码(详见 code complete)。与命令模式很相似,只不过命令模式的通用接口,在这里由enum类代替。
oop不同类关联不同行为,而使用常量方法,每个实例就是一个独立的类型(当然,并不等同于“类”)。上例中一个enum类似乎被当作“超类”对待,具体到每个实例通过getinfo()表现出不同的行为,多态。

enum likeclasses {
winken { void behavior() { print("behavior1"); } },
blinken { void behavior() { print("behavior2"); } },
nod { void behavior() { print("behavior3"); } };
abstract void behavior();
}
public class notclasses {
// void f1(likeclasses.winken instance) {} // nope
} /* output:反编译后的代码
compiled from "notclasses.java"
abstract class likeclasses extends java.lang.enum{
public static final likeclasses winken;
public static final likeclasses blinken;
public static final likeclasses nod;
...
*///

1.abstract class likeclasses extends java.lang.enum 一个抽象类
2.方法常量 就是这个抽象类的static 域( field)

**其中的抽象方法也可以换做 普通方法,那么默认赋予每个enum实例一个默认的方法:

public enum constantspecificmethod {

    date_time, // 赋予默认 getinfo()
    /*
     * { string getinfo() { return dateformat.getdateinstance().format(new
     * date()); } },
     */
    classpath {
        string getinfo() {
            return system.getenv("classpath");
        }
    },
    version {
        string getinfo() {
            return system.getproperty("java.version");
        }
    };
    string getinfo() {
        system.out.println("default");
        return null;
    };

    public static void main(string[] args) {
        for (constantspecificmethod constantspecmethod : values()) {
            system.out.println(constantspecmethod.getinfo());
        }
    }

}

enum,enummap,enumset

原文地址:http://blog.csdn.net/lemon89/article/details/45422721

软件教程库 该篇文章地址:https://www.itjcku.com/9999/1091525.html

阅读全部内容


Tags:

返回首页



推荐内容

Hibernate乱码问题解决

乱码问题其实归根接地就是两端的字符集不统一。 解决思路也有两种: 1. 修改两端字符集统一。 2. 通过代码进行转 ...

eclipse集成struts2.3.20

需要强调的是,这里介绍的是在eclipse工具下集成struts2.3.20而不是myeclipse添加对struts2 ...

ubi文件系统制作,还是"-c"选项的问题

以下是分析记录: --------------------------------------------------- ...

如何把事情做到最好读书笔记1

开篇语: 每个人生来都具备足够的潜力,每个人都能做到别人#30524;中难以企及的事情。请永远保持初学之心,勇敢面对 ...

如何把事情做到最好读书笔记2

第二章 认清自己:你属于哪种类型的人 你必须足够了解你自己,下面有三种类型的人、 (1)浅尝辄止者 浅尝辄止者对一切 ...

如何把事情做到最好读书笔记3

第三章 一份耕耘才能一份收获 当你决定踏上精益求精之路时,你会突然发现周围的一切都与你所追求的#26684;#2668 ...

如何把事情做到最好读书笔记4

第四章 热爱平台期 从小,我们接受的教育就是好好学习,这样才能上好的大学,上好的大学才能找到好工作,有好工作才能有钱买 ...

习题10-21二项式系数UVa1649

1.题目描述:点击打开链接 2.解题思路:本题利用枚举#43;二分解决。问题的关键是选对枚举对象,因为要找c(n,k)= ...

mysql小技巧

selectnow(),user(),version(),database(); #最后输入\c是放弃的意思 des ...

Java学习笔记——面试常客:写出一个死锁的例子

现在的面试挺蛋疼,为了考察大家的语言掌握水平,类#20284;这样的题特别多,不过在某个角度来说确实能看出一个人对某个知 ...

UVA-10396VampireNumbers暴力+打表

题目大意:给出n,要求你输出所有符合规则的n位数 规则如下,这个n位数由两个n/2位数相乘得到,并且满足 1.这n位 ...

CF148D.Bagofmice[概率dp]

题目链接:http://codeforces.com/problemset/problem/148/d 题目大意:一袋子 ...

HDU-1846-BraveGame(巴什博弈)

题目传送:brave game 介绍: 巴什博奕(bash game): 首先我们来玩一个比较古老的报数游戏。a ...

HDU-2149-PublicSale(巴什博弈)

题目传送:public sale 思路:巴什博弈 ac代码: #include lt;cstdiogt; # ...

enum实现售卖机

首先 推荐一下google的代码风格 :https://google-styleguide.googlecode ...

批量添加用户

a、创建用户文件,因为添加的用户比较多,因此编写脚本创建一个用户文件user.txt #!/bin/ba ...

解决侧滑中ViewPager和SlidingMenu的滑动冲突

当我们在使用开源框架slidingmenu时,如果要是使用到viewpager,就会出现滑动冲突。 解决方案: }/** ...

shell打乱文件行

思路,产生一个随机数组,然后按按照数组的元素将文件中行的重新输出 1、随机数组的生成 看书的时候感觉很是简单。第 ...

编程之美2015初赛第二场AB

题目1 : 扑克牌 时间限制:2000ms 单点时限:1000ms 内存限制:256mb 描述 一副不含王的扑 ...

Java设计模式之单例模式(恶汉式和懒汉式)

/* * 单例模式: * 饿汉式:类一加载就创建对象 * 懒汉式:用的时候,才去创建对象 * 面试题:单例模式的 ...

Html简单介绍

1、html--- hypertext markup language 的缩写 --- 超文本 标记 语言. 这个技 ...

configure:error:youmustconfigureinaseparatebuilddirectory

configure glibc-2.14 时出现以下错误: [[email#160;protected] opt]# ...

kohana框架生成feed

创建feed feed::create()斱法用给定癿参数杢创建 rss戒者 atom feed。下面是可接叐癿参数。 ...

用USB安装linux

手边没有光驱,安装ubuntu可以用 linuxlive usb creator 2.9.3,在百度网盘里有的。http ...

一个复杂子查询SQL优化

select * from test.vmark vk where id in (select v.id ...

Java多线程中常见的几个问题

我们都知道,在java中要想实现多线程,有两种手段,一种是继续thread类,另外一种是实现runable接口。  1. ...

OracleDataIntegrator12c-CreatingaCollocatedAgent

http://www.oracle.com/webfolder/technetwork/tutorials/obe/fm ...

CompilingGCC5onOSX

compiling gcc 5 on os x */--> pre.src {backgro ...

查看Linux上MySQL版本信息

如果mysql是用rpm或者yum安装的,可用 #rpm -qa|grep mysql查看. 如: [[email#16 ...

《赢在测试2-中国软件测试专家访谈录》读书笔记

《赢在测试2-中国软件测试专家访谈录》读书笔记 2015-04-30 测试人物经历与观点 1.董杰 百度测试架构师 董杰 ...


本网站部分内容来自互联网,版权归原作者所有,文章内容仅代表原作者个人观点。如有侵权请联系我们删除 电子邮件 itjcku@foxmail.com