`

枚举与静态常量比较

 
阅读更多

 

静态常量是枚举模式的应用
它有很多缺点:类型不安全(静态常量可以随意增加使用或操作),无命名空间,脆弱(某常量值改变后客户端如果不编译仍能使用,但表现却是未定义的),静态常量打印值为数字,也不具提示性等等

 

 

客户端未编译有待推敲?

 

 

This pattern has many problems, such as:

  • Not typesafe - Since a season is just an int you can pass in any other int value where a season is required, or add two seasons together (which makes no sense).
  • No namespace - You must prefix constants of an int enum with a string (in this case SEASON_ ) to avoid collisions with other int enum types.
  • Brittleness - Because int enums are compile-time constants, they are compiled into clients that use them. If a new constant is added between two existing constants or the order is changed, clients must be recompiled. If they are not, they will still run, but their behavior will be undefined.
  • Printed values are uninformative - Because they are just ints, if you print one out all you get is a number, which tells you nothing about what it represents, or even what type it is.

脆弱性的理解在这里比如是静态常量,修改了,插入或者增加,客户端必须得重新编译来适应新的变化,而枚举的话则不必,比如它可以通过遍历来囊括所有新的变化,客户端代码可以不用改变,这就是用静态常量脆弱性的体现。

 

分享到:
评论

相关推荐

    使用类常量方式实现PHP枚举

    - **类型安全**:PHP不强制类常量的值必须与声明时一致,因此可以为枚举类添加任何类型的常量。 - **枚举值的比较**:比较枚举值时,需要使用全等运算符(`===`),而不是相等运算符(`==`),以确保值和类型都匹配...

    C枚举常量转换易语言源码.rar

    标题中的"C枚举常量转换易语言源码"指的是一个编程相关的资源,它涉及到两种不同的编程语言:C语言和易语言。C语言是一种底层、静态类型的编程语言,而易语言则是一种面向对象、中文编程的高级语言,设计目标是使...

    谈谈你可能并不了解的java枚举

    Java枚举实际上是单例的,所有枚举实例都是通过静态常量直接创建并初始化的。在反编译后的代码中可以看到,每个枚举常量在静态初始化块中被创建,如`EAST = new Direction("EAST", 0, "\u4E1C")`。 3. 枚举的继承与...

    MLDn学习笔记 —— JDK新特性(枚举)

    3. 静态常量:枚举常量在内存中只存在一次,保证了值的安全性。 4. 自动序列化:枚举类型自动支持Java的序列化机制。 三、枚举的方法 1. `values()`:返回枚举类型的全部常量数组,常用于遍历枚举。 2. `valueOf...

    java 枚举学习心得

    从Java 1.5版本开始引入,枚举提供了一种更安全、更规范的方式来表示有限的固定值集合,相比传统的使用静态常量的方式,枚举在功能和灵活性上有了显著的提升。 在1.5之前,为了模拟枚举的效果,开发者通常会创建一...

    深入理解 Java 枚举(枚举的方法+枚举的特性+枚举可以实现接口+组织枚举+策略枚举+枚举工具类等)

    3. 枚举值本质上是静态常量,定义的枚举值会被默认修饰为 public static final。 4. 枚举提供了一些基本方法,如 values()、name()、ordinal()、getDeclaringClass()、equals() 等。 枚举的方法: 1. values():...

    说说Java中的枚举 转 可以了,够了 包括EnumSet(Map)

    此外,枚举还支持常量的自然排序,可以实现`Comparable`接口自定义比较规则,也可以通过`enum`类实现`Comparator`接口来定义比较逻辑。枚举还可以拥有构造函数、方法以及静态变量和方法,使得枚举类型更加灵活,能够...

    枚举(switch、覆盖枚举、实现接口等)

    在上述例子中,`Color`枚举定义了一个静态方法`getName(int index)`,根据索引返回对应的颜色名称,以及`get`和`set`方法来访问和修改成员变量。注意,自定义方法需在枚举实例序列之后定义,并以分号结束。 4. 覆盖...

    java中enum枚举的详细用法

    7. 枚举的常量与静态字段 枚举类中的字段默认是静态的,因此可以在不创建枚举实例的情况下访问它们。这意味着,枚举常量可以直接通过枚举类型名访问,如`Color.RED`。 8. 枚举的比较 枚举实例之间的比较可以使用`...

    JAVA枚举类型的用法详解

    首先,枚举类型在本质上等同于定义了一组静态常量。创建枚举类型的语法如下: ```java public enum Belle { para1, para2, para3, para4; } ``` 这会创建一个名为`Belle`的枚举类,其中包含四个静态常量`para1`, ...

    使用枚举规范方法命名

    在Java编程语言中,枚举(Enum)是一种特殊的类,用于定义一组固定的常量集合。枚举在很多场景下都十分有用,例如表示状态、角色、颜色等有限且不变的值。本篇将深入探讨如何使用Java枚举,并遵循规范进行方法命名。...

    java枚举ppt和详细代码

    在早期的Java版本中,没有枚举类型,开发者通常会使用静态常量来模拟枚举的功能。例如: ```java public class Color { public static final Color RED = new Color(); public static final Color GREEN = new ...

    使用JS枚举简化if else

    这种方法创建的枚举更加面向对象,常量作为类的静态属性。 ### 使用枚举简化if...else 在处理条件判断时,通常我们会使用if...else或switch语句。以下是一个使用if...else的经典例子: ```javascript function ...

    java枚举类型说明

    - **方法**: 枚举类型可以有方法,这使得它们不仅仅是一组静态值,还可以包含行为逻辑。 - **构造函数**: 枚举也可以有自己的构造函数,但是必须是私有的。 #### 三、枚举类型的优势 使用Java枚举类型相比传统的`...

    JAVA枚举JAVA枚举.doc

    相较于简单的常量定义或类的静态常量实例,枚举具有以下优势: 1. **类型安全**:枚举类型的实例只能是预定义的,无法通过 new 关键字创建额外的实例,这避免了可能出现的类型错误。 2. **自动实现 Comparable 和 ...

    Java手动方式创建枚举类示例

    Java手动方式创建枚举类是一种常见的编程方法,在Java中可以使用枚举类型来定义一组具有相同特征的常量。通过手动方式创建枚举类,可以更好地控制枚举类型的行为和特性。在本文中,我们将通过一个实例来介绍Java手动...

    java enum 枚举 学习资料

    compareTo() 方法是枚举类中的一个实例方法,它用于比较两个枚举元素的顺序。 9. name() 方法 name() 方法是枚举类中的一个实例方法,它返回元素实例的变量名,该方法为 final 不可覆盖的。 10. 枚举类的应用 ...

    在Java中使用枚举

    - **常量定义**:在Java 5之前,通常使用静态常量来模拟枚举,如描述中所示。 - **单例类**:通过创建只包含静态成员的类,可以实现类似枚举的行为,但缺乏内置的枚举特性。 Java的枚举类型不仅提供了类型安全,还...

    java枚举状态机

    枚举的静态性质确保了状态的不可变性,抽象方法提供了行为的定义,而内部的转换方法则控制了状态的变化。这种模式在处理需要根据状态进行不同操作的场景时特别有用,例如处理工作流、网络连接状态或者游戏状态等。

    Java高新技术_java5的枚举的基本应用

    5. 枚举集与枚举常量: Java枚举可以实现接口,也可以拥有字段和方法,因此可以用来创建复杂的枚举集。例如,可以定义一个表示星期几的枚举,并为每个枚举值添加额外的属性或行为: ```java public enum DayOfWeek...

Global site tag (gtag.js) - Google Analytics