`
vitojeng
  • 浏览: 20541 次
  • 性别: Icon_minigender_1
  • 来自: TW
社区版块
存档分类
最新评论

簡單記錄 Java enum class 的運用

    博客分类:
  • java
阅读更多

自己一直以在都是這麼用 enum 的:

// 以下代碼出自 Java Tutorial
public enum Day {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, 
    THURSDAY, FRIDAY, SATURDAY 
}

....
Day day;
day = Day.SUNDAY;

把它當做一般的列舉型態來用. 而 enum 最大的便利就是可以用在 switch( ) ... case ... 語法上.

 

不過最近比較深入研究 enum 之後, 發現它其實是個 class, 可以擁有 constructor, method, 及 variable, 如此一來這樣可以做很多事.

 

下面寫一個簡單的範例示範其概念, FileType 列舉了二個檔案型態, 分別為 xls, csv, 不同的檔案型態各有其 parser 的實作. xls 的 parser class 是 ExcelParser, csv 的 parser class 是 CSVParser.

 

xls ( new ExcelParser() ) 意思是 xls 這個列舉值在建立時, 建立 ExcelParser instance 做為其 constructor 的參數. 因此, 在使用不同的 FileType 列舉值時, 就可以取得各自對應的 parser.  同樣的做法也可以運用在不同的 Action.  不但利於擴充, 也使得程式碼容易閱讀.

 

這個範例主要是展示運用字串取得對應的 FileType, 並執行其 parser, 取得結果. 完全不用 if ... else 來判斷, 有利於未來 FileType 種類的擴充, 或是在 FileType 相關邏輯的增加時, 可以寫在 FileType enum class 內.

 

public interface Parser {
    public List parse(File file);
}

public enum FileType {
    xls ( new ExcelParser() ),
    csv ( new CSVParser() );

    private Parser parser;

    // constructor
    FileType(Parser parser) {
        this.parser = parser;
    }

    public Parser parser() { return this.parser; }
}

public void test(String typeName, File dataFile){
    FileType fileType = FileType.valueOf(typeName);
    List data = fileType.parser().parse(dataFile);
}

附註: 上述範例主要在展示概念, 沒實際測試過.

 

if ... else 的撰寫方式將與業務邏輯結合在一起, 容易模糊業務邏輯的焦點, 也不利於日後的維護及擴充.

 

我想, enum 與 class 的結合, 在實作 state machine 時, 會有很大的便利性. 一般以 class 實作 state machine 時, 會替每個 state 建立一個 class, 所有 state 都繼承自一個 base class, 這樣容易使得 class 變得很多, 類別佈局自然變得較複雜了.

 

0
0
分享到:
评论

相关推荐

    springboot项目中枚举类型的最佳实践

    public class EnumNameSerializer extends JsonSerializer<Enum> { @Override public void serialize(Enum value, JsonGenerator gen, SerializerProvider serializers) throws IOException { gen.writeString...

    基于java语言的人机猜拳游戏

    在这个过程中,我们运用了Java的枚举类型、随机数生成、面向对象设计原则以及简单的游戏逻辑。这个项目不仅可以帮助初学者巩固基础,也能让有经验的开发者实践设计模式和提高代码质量。在实际编码过程中,还可以...

    Java中的reflect 反射的基本东西,

    3. **获取类信息**:Class对象提供了获取类的各种信息的方法,如类名(`getName()`),父类(`getSuperclass()`),接口(`getInterfaces()`),以及类的修饰符(`isInterface()`, `isPrimitive()`, `isEnum()`等)...

    Java设计模式责任链模式共7页.pdf.zip

    在Java编程中,责任链模式被广泛应用于事件驱动编程、日志记录系统、权限控制等场景。 责任链模式的核心概念是将处理请求的对象连接成一条链,每个对象都包含对下一个对象的引用。当一个请求沿着链条传递时,每个...

    511.509.JAVA基础教程_枚举类与注解-jdk8新特性:类型注解(511).rar

    例如,创建一个简单的注解来记录方法执行时间: ```java import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang....

    坦克大战java源码

    1. **Java基础**:源码中会大量运用到Java的基础语法,如变量定义、条件语句(if-else)、循环结构(for、while)、函数定义等。同时,你也会看到类(class)和对象(object)的概念,这是Java的核心部分。通过游戏...

    java的API文档

    6. **反射机制**:`Class`类是Java反射的核心,允许我们在运行时动态获取类的信息,如类名、方法、字段等,甚至可以动态创建对象并调用方法。 7. **泛型**:泛型引入了类型参数的概念,增强了代码的类型安全,允许...

    《阿里巴巴Java开发手册》v1.4.0(详尽版).docx

    ### 《阿里巴巴Java开发手册》v1.4.0(详尽版)——核心知识点概览 #### 一、概述 ...这些规则覆盖了从基础的命名风格到高级的设计模式运用等多个层面,对于从事Java开发的工程师来说具有很高的参考价值。

    Java反射学习和反射的应用场景干货都在这里

    在Java中,获取Class对象有三种方式: - 通过对象的`getClass()`方法,例如`person.getClass()` - 通过类的`class`属性,例如`Person.class` - 使用`Class.forName()`静态方法,需要提供完整的类名(包括包名),...

    第6讲_单例模式(Singleton)

    此外,Java 5引入的枚举也可以用来实现线程安全的单例模式,这是最简单也最安全的方式,因为它自动处理了序列化和多线程问题: ```java public enum EnumSingleton { INSTANCE; public void singletonMethod() { ...

    单例模式代码和文档

    单例模式是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。这种模式在资源管理、配置对象、线程池等场景中非常常见,因为这些场景往往...在实际开发中,需要根据项目需求和环境来灵活运用。

    23种设计模式的java实现

    public enum Singleton { INSTANCE; } ``` 2. 工厂模式(Factory):定义一个创建对象的接口,但让子类决定实例化哪一个类。工厂方法让类的实例化推迟到子类。 ```java public abstract class Factory { public ...

    自定义注解

    在Java编程语言中,自定义注解(Custom Annotation)是一种元数据,用于向编译器或JVM提供信息,帮助实现代码的自动化处理。...理解并熟练运用自定义注解,能帮助开发者编写出更加优雅和高效的Java程序。

    单例模式的介绍(含程序代码)

    这种模式在很多场景下非常有用,比如资源管理、日志记录、配置管理等,因为这些类通常只需要一个全局共享的实例来协调操作。 在Java中,实现单例模式主要有两种方式:饿汉式和懒汉式。饿汉式是在类加载时就完成了...

    Hibernate注解详解.pdf

    主键字段通常是用来唯一标识数据库表中每一行记录的字段。 在Hibernate中,可以通过注解的方式定义表结构以及字段属性。下面是一些常用的注解及其用法: - **`@Table`**:用于指定实体Bean对应的数据库表名。例如...

    Java开发常见问题总结.docx

    ### Java开发常见问题总结 #### 一、基础语法与规范 1. **使用`public class`及驼峰命名法** - 在Java中,每个源文件...开发者应当熟练掌握这些知识点,并在实践中灵活运用,以编写高质量、高效的Java应用程序。

    自定义注解annotation及用法

    在Java编程语言中,注解(Annotation)是一种元数据,它提供了向编译器、工具或运行时系统提供额外信息的方式。自定义注解允许开发者创建自己的标记来满足特定需求,比如代码生成、验证、持久化等。本文将深入探讨...

    MySQL中set类型的使用

    与`ENUM`类型相似,`SET`也有一个预先定义的值列表,但`SET`允许记录包含多个值。 `SET`类型的定义语法如下: ```sql SET('value1', 'value2', ..., 'valuem') ``` 这里的`value1`到`valuem`是可选的值,最多可以...

Global site tag (gtag.js) - Google Analytics