看 thinking in java 枚举那一段,看到这个例子还挺有意思的,所以记录了下来。
这是用枚举+责任链模式 模拟邮件发信步骤的例子。(PS:遍历枚举时顺序是按照定义时的顺序)
废话少说,贴代码。效果把代码拷回去run一下就知道了。
package enums;
import java.util.Random;
//获取枚举中随机属性
public class Enums {
public static <T extends Enum<T>> T random(Class<T> ec){
return random(ec.getEnumConstants());
}
public static <T> T random(T[] values){
//每次调用new一个新random,标识要不一样,要不然每次运行的结果都一样。
return values[new Random(System.nanoTime()).nextInt(values.length)];
}
}
package enums;
import java.util.Iterator;
class Mail {
enum GeneralDelivery {
NO, OK1, OK2, OK3, OK4, OK5
};
enum Scannability {
// 信件无法扫描
UNSCANNABLE, YES1, YES2, YES3, YES4
};
enum Readablility {
// 字迹模糊不清
ILLEGIBLE, YES1, YES2, YES3, YES4
};
enum Address {
// 寄件地址错误
INCORRECT, OK1, OK2, OK3, OK4, OK5, OK6
};
enum ReturnAddress {
// 返件地址模糊不清
MISSING, OK1, OK2, OK3, OK4, OK5
};
// 取邮件
GeneralDelivery generalDelivery;
// 扫描邮件
Scannability scannability;
// 信件可读性
Readablility readablility;
// 地址
Address address;
// 退件地址
ReturnAddress returnAddress;
// 信件计数
static long counter = 0;
// 信件ID
long id = counter++;
public String toString() {
return "Mail" + id;
}
public String details() {
return toString() + ",General Delivery: " + generalDelivery
+ ",Address Scanability: " + scannability
+ ",Address Readablility: " + readablility
+ ",Address address: " + address + ",Return address: "
+ returnAddress;
}
// 创建一封信件
public static Mail randomMail() {
Mail m = new Mail();
m.generalDelivery = Enums.random(GeneralDelivery.class);
m.scannability = Enums.random(Scannability.class);
m.readablility = Enums.random(Readablility.class);
m.address = Enums.random(Address.class);
m.returnAddress = Enums.random(ReturnAddress.class);
return m;
}
// 创建count个邮件迭代集合
public static Iterable<Mail> generator(final int count) {
return new Iterable<Mail>() {
int n = count;
@Override
public Iterator<Mail> iterator() {
return new Iterator<Mail>() {
@Override
public boolean hasNext() {
return n-- > 0;
}
@Override
public Mail next() {
return randomMail();
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
};
}
};
}
}
class PostOffice {
enum MailHandler {
GENERAL_DELIVERY {
@Override
public boolean handle(Mail m) {
switch (m.generalDelivery) {
case NO:
System.out.println("揽收邮件(" + m + ")失败!");
return false;
default:
System.out.println("揽收邮件(" + m + ")成功!");
return true;
}
}
},
MACHINE_SCAN {
@Override
public boolean handle(Mail m) {
switch (m.scannability) {
case UNSCANNABLE:
System.out.println("机器扫描邮件寄件地址(" + m + ")失败!");
return false;
default:
System.out.println("机器扫描邮件寄件地址(" + m+ ")成功!");
switch (m.address) {
case INCORRECT:
System.out.println("邮件(" + m + ")寄件地址错误!");
return false;
default:
System.out.println("邮件(" + m+ ")寄件地址正确!");
return true;
}
}
}
},
VISUAL_INSPECTION {
@Override
public boolean handle(Mail m) {
switch (m.readablility) {
case ILLEGIBLE:
System.out.println("人工核查邮件(" + m + ")寄件地址发现错误!");
return false;
default:
System.out.println("人工核查邮件(" + m + ")寄件地址正常!");
return true;
}
}
},
RETURN_TO_SEND {
@Override
public boolean handle(Mail m) {
switch (m.returnAddress) {
case MISSING:
System.out.println("核查邮件(" + m + ")返件地址发现字迹模糊不清!");
return false;
default:
System.out.println("核查邮件(" + m + ")返件地址结果正常!");
return true;
}
}};
abstract boolean handle(Mail m);
}
//模拟发邮件
static void handle(Mail m){
for(MailHandler handler : MailHandler.values()){
if(!handler.handle(m)){
System.out.println("邮件"+m+" 是一封死信!");
return;
}else continue;
}
System.out.println("邮件"+m+" 被正常发送!");
}
public static void main(String[] args){
for(Mail mail : Mail.generator(10)){
// System.out.println(mail.details());
handle(mail);
System.out.println("****************");
}
}
}
分享到:
相关推荐
本篇文章将深入探讨Java枚举的特性、用法以及如何在实际开发中充分利用它们。 一、枚举的基本用法 1. 声明枚举类型: ```java public enum Color { RED, GREEN, BLUE } ``` 在这里,`Color`是枚举类型,`RED`, `...
本资源包提供了一些关于`Enum`枚举的深入学习材料,包括实例、常见问题以及相关的文档,非常适合Java开发者进行高级编程的学习和复习。 首先,枚举的基本语法是定义一个公共类,前面加上关键字`enum`。例如: ```...
### Java 枚举类型详解 #### 一、引言 ...通过以上的介绍,我们可以看到Java枚举类型不仅提供了类型安全的保障,还为开发者带来了极大的灵活性。合理地使用枚举类型,可以显著提高代码的质量和可维护性。
Java枚举数据类型是Java 1.5及以后版本引入的一种强大的、类型安全的数据结构,旨在解决传统int常量或String常量表示枚举时存在的问题。在Java中,枚举是一种特殊的类,用于定义一组预定义的常量,这些常量在程序中...
Java枚举支持单例模式,因为每个枚举常量都是唯一的,不能通过`new`关键字实例化。此外,枚举类型的枚举常量可以按照声明顺序自然排序,这使得它们在处理有序数据时非常方便。 枚举类型还可以与其他集合框架结合...
以上只是"Java高级实用教程"中的一部分核心内容,实际教程可能还涵盖设计模式、NIO、并发容器、JMS消息队列、Spring框架、数据库连接池等更多主题。通过深入学习和实践,你将能够成为一位熟练的Java开发者,解决复杂...
《Java与模式》是阎宏博士撰写的一本经典IT著作,深入浅出地探讨了如何在Java编程中应用设计模式。这本书的光盘源码包含了书中提到的各种模式的实例代码,为读者提供了实践和理解设计模式的宝贵资源。在本文中,我们...
4.拆箱装箱的中的项元模式,当该对象在一个字节内时 -128~~127 的时候 用的是同一个对象 5.可变量参数, object ... paramName,当对参数不确定的时候] 6.枚举,对目标的选择进行了强制的约束 7....... ..........
**单例模式**、**工厂模式**、**抽象工厂模式**、**建造者模式**、**原型模式**、**适配器模式**、**装饰器模式**、**代理模式**、**桥接模式*...**、**中介者模式**、**备忘录模式**、**状态模式**、**责任链模式**...
枚举类型可以拥有方法和字段,并且支持抽象方法,使得它们在设计模式中,如策略模式和工厂模式,有着广泛的应用。 3. **泛型(Generics)**:泛型提供了一种方式来限制容器对象只能存储特定类型的数据,增强了类型...
Java语言的高级特性包括但不限于:多线程、异常处理、反射、枚举、泛型、IO流、网络编程、集合框架等。在这些章节中,习题可能会涉及到如何创建和管理线程,如何优雅地处理程序运行时的异常,如何利用反射动态操作类...
9. **责任链模式(Chain of Responsibility)**:避免将处理逻辑硬编码到对象中,而是让对象组成一条链,请求沿着链传递,直到被某个对象处理。 10. **命令模式(Command)**:将请求封装为一个对象,以便使用不同...
通过以上对Java基础知识的回顾以及高级进阶知识点的介绍,我们不仅了解了Java作为一种广泛使用的编程语言的基本特性和核心概念,还深入探讨了其高级特性、设计模式以及相关的技术和框架。这些知识对于希望进一步提升...
在Java中,主要分为三大类:创建型模式(如单例、工厂方法、抽象工厂等)、结构型模式(如适配器、装饰器、代理等)和行为型模式(如观察者、策略、责任链等)。这些模式在实际编程中有着广泛的应用,例如,单例模式...
这通常涵盖了Java的多线程、网络编程、I/O流、反射、枚举、集合框架、设计模式、JVM优化等多个重要主题。以下是这些关键知识点的详细介绍: 1. **多线程**:Java以其强大的并发处理能力而著称,多线程是其核心特性...
本资料包聚焦于“JAVA程序常用设计模式”,旨在帮助中高级JAVA程序员进一步提升编程能力。 1. 单例模式:确保一个类只有一个实例,并提供一个全局访问点。在Java中,单例模式通常通过双重检查锁定、静态内部类或...
- **责任链模式**:避免对象间耦合,通过将请求沿着处理者链传递,直到找到合适的处理者。 - **观察者模式**:定义对象之间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动...
《JAVA核心技术 卷1 高级特性》是Java开发者深入理解平台的重要参考资料,它涵盖了Java编程的高级主题,包括多线程、网络编程、高级I/O、反射、泛型、枚举、注解等核心概念。这本书是基于原书第9版编写的,更新了...
在高级特性中,Java的IO流系统、多线程编程、反射机制、枚举类型、注解(Annotation)以及Java 8及以后版本引入的Lambda表达式和Stream API,都可能是本书的重点章节。这些内容对于编写高效、可维护的代码至关重要。...