一、枚举类型——常量特定方法

这篇具有很好参考价值的文章主要介绍了一、枚举类型——常量特定方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Java 的枚举机制可以通过为每个枚举实例编写不同的方法,来赋予它们不同的行为。要实现这一点,你可以在枚举类型中定义一个或多个抽象方法,然后为每个枚举实例编写不同的实现,例如:

ConstantSpecificMethod.java

import java.text.DateFormat;
import java.util.Date;

public enum ConstantSpecificMethod {
    DATE_TIME {
        @Override
        String getInfo() {
            return DateFormat.getDateInstance().format(new Date());
        }
    },
    CLASSPATH {
        @Override
        String getInfo() {
            return System.getenv("CLASSPATH");
        }
    },
    JAVA_HOME {
        @Override
        String getInfo() {
            return System.getenv("JAVA_HOME");
        }
    },
    VERSION {
        @Override
        String getInfo() {
            return System.getProperty("java.version");
        }
    };

    abstract String getInfo();

    public static void main(String[] args) {
        for (ConstantSpecificMethod csm : values()) {
            System.out.println(csm.getInfo());
        }
    }
}

运行结果如下:
一、枚举类型——常量特定方法

注意:如果 CLASSPATH 和 JAVA_HOME 打印为 null,检查系统环境变量是否已设置(如果已设置但打印还是为 null ,可以尝试重启电脑,我遇到的情况就是重启生效)

你可以通过关联的枚举实例来查找和调用方法,这通常叫作表驱动模式(注意,和前面的命令模式很相似)。

在面向对象编程中,不同的行为和不同的类相关联,通过常量特定方法,枚举类型的 各种实例可以拥有各自的行为,这表明每个实例都是不同的类型。在上面的例子中,每个枚举实例都被视同于“基类" ConstantSpecificMethod 的实例,但调用 getlnfo() 方法时的行为是多态的。

然而,这两者的相似性也只能到此为止,你无法将 enum 实例等同于类类型:

NotClasses.java

enum LikeClasses {
    WINKEN {
        @Override
        void behavior() {
            System.out.println("Behavior1");
        }
    },
    BLINKEN {
        @Override
        void behavior() {
            System.out.println("Behavior2");
        }
    },
    NOD {
        @Override
        void behavior() {
            System.out.println("Behavior3");
        }
    };

    abstract void behavior();
}

public class NotClasses {
    // void f1(LikeClasses.WINKEN instance) {} // 不行
}

javac、javap

一、枚举类型——常量特定方法

在 f1() 方法中,编译器不允许将枚举实例作为类类型来使用,只要设想一下编译器是如何生成代码的,这一点就说得通了,每个枚举元素都是 LikeClasses 的一个 static final 的实例。

同样,由于它们是静态的,内部枚举中的枚举实例表现得并不像普通的内部类,你无法从外部类访何非静态域或方法 。

再来看一个洗车的例子,每个用户都拿到了一个洗车选项的菜单,每个选项都代表不同的操作,每个选项都可以分配一个常量特定方法,然后用一个 EnumSet 来持有用户的选择。

CarWash.java

import java.util.EnumSet;

public class CarWash {
    public enum Cycle {
        UNDERBODY {
            @Override
            void action() {
                System.out.println("Spraying the underbody");
            }
        },
        WHEELWASH {
            @Override
            void action() {
                System.out.println("Washing the wheels");
            }
        },
        PREWASH {
            @Override
            void action() {
                System.out.println("Loosening the dirt");
            }
        },
        BASIC {
            @Override
            void action() {
                System.out.println("The basic wash");
            }
        },
        HOTWAX {
            @Override
            void action() {
                System.out.println("Applying hot wax");
            }
        },
        RINSE {
            @Override
            void action() {
                System.out.println("Rinsing");
            }
        },
        BLOWDRY {
            @Override
            void action() {
                System.out.println("Blowing dry");
            }
        };

        abstract void action();
    }

    EnumSet<Cycle> cycles = EnumSet.of(Cycle.BASIC, Cycle.RINSE);

    public void add(Cycle cycle) {
        cycles.add(cycle);
    }

    public void washCar() {
        for (Cycle c : cycles) {
            c.action();
        }
    }

    @Override
    public String toString() {
        return cycles.toString();
    }

    public static void main(String[] args) {
        CarWash wash = new CarWash();
        System.out.println(wash);
        wash.washCar();
        // Order of addition is unimportant:
        wash.add(Cycle.BLOWDRY);
        wash.add(Cycle.BLOWDRY); // Duplicates ignored
        wash.add(Cycle.RINSE);
        wash.add(Cycle.HOTWAX);
        System.out.println(wash);
        wash.washCar();
    }
}

运行结果如下:
一、枚举类型——常量特定方法

定义一个常量特定方法的语法和定义匿名内部类差不多,但是要更简洁一些。

这个例子还展示了 EnumSet 的更多特点,它是一种 Set,所以每个可选洗车项目都只能持有一个选项,用相同的参数对 add() 方法的重复调用会被忽略(这很好理解,因为打开开关一次和多次是一样的) 。另外,添加枚举实例的顺序并不重要——输出顺序由枚举声明的顺序决定。

重写常量特定方法,而不是实现一个抽象方法,这是可能的吗?是的,如以下示例所示:

OverrideConstantSpecific.java

public enum OverrideConstantSpecific {
    NUT, BOLT,
    WASHER {
        @Override
        void f() {
            System.out.println("Overridden method");
        }
    };

    void f() {
        System.out.println("default behavior");
    }

    public static void main(String[] args) {
        for (OverrideConstantSpecific ocs : values()) {
            System.out.print(ocs + ": ");
            ocs.f();
        }
    }
}

运行结果如下:
一、枚举类型——常量特定方法

虽然枚举确实阻止了某些类型的代码,但是通常来说,可以把它们当作类来实验。文章来源地址https://www.toymoban.com/news/detail-493247.html

到了这里,关于一、枚举类型——常量特定方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • iOS开发Swift-8-类的继承,方法重写,构造器,枚举类型,可选类型,强制解包,可选绑定,隐式可选类型...

    1.类的继承  2.方法的重写 3.构造器: 创建对象;给对象进行初始化  4.枚举类型 5.枚举的原始值 6.枚举的简写  7.可选类型  8.强制解包 9.可选绑定  10.隐式可选类型  11.可选类型自动赋值

    2024年02月09日
    浏览(42)
  • 2.Java数据类型,变量及常量

    一、Java数据类型 1、什么是数据类型? 数据类型在计算机语言里面,是对内存位置的一个抽象表达方式,可以理解为针对内存的一种抽象的表达方式。 2、为什么要用到数据类型? Java是健壮型语言,所以Java对于数据类型的规范会相对严格。同时数据类型的出现是为了把数据

    2023年04月08日
    浏览(44)
  • Rust变量、常量声明与基本数据类型

    Rust是一门系统级别的编程语言,注重安全性、性能和并发。在这篇博客中,我们将介绍Rust中的变量、常量声明以及基本数据类型,并通过示例说明每一种类型的用法。 在Rust中,使用 let 声明变量。变量默认是不可变的,要使其可变,需要使用 mut 。 常量使用

    2024年01月18日
    浏览(61)
  • Go类型全解:常量与变量大全!

    本篇文章深入探讨了 Go 语言中类型确定值、类型不确定值以及对应类型转换的知识点,后续充分解析了常量与变量及其高级用法,并举出丰富的案例。 关注公众号【TechLeadCloud】,分享互联网架构、云服务技术的全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、

    2024年02月09日
    浏览(51)
  • 二、GoLang输出HelloWorld、基本数据类型、变量常量定义、基本类型转换

    go语言中,想要输出内容到控制台,package必须是main,包括方法名也必须是main, go语言输出的语法是 fmt 库。 Go语言的基本类型有: boolean:布尔类型 true / false string :字符串类型 数值型: int8:有符号8位整型(-128到127)长度 int16:有符号16位整型(-32768到32767)长度 int32:有

    2024年02月09日
    浏览(57)
  • C 语言:类型转换与常量的细致理解

    有时,您必须将一种数据类型的值转换为另一种类型。这称为 类型转换 当您将一种类型的值分配给另一种类型的变量时,编译器会自动进行隐式转换。 例如,如果您将一个 int 值分配给一个 float 类型: 如您所见,编译器会自动将 int 值 9 转换为 float 值 9.000000。 这可能是危

    2024年02月04日
    浏览(35)
  • 【C】C语言数据类型、常量变量的介绍

    下图为C语言常见的数据类型: (浮点数就是我们常见的小数,字符类型要用‘’引起来,在C语言中字符串类型要用字符数组来表示,以后给大家慢慢介绍) 在C语言中没种数据类型所占的空间大小是不一样的,在这里给大家介绍一个库函数: sizeof ,它可以计算每种数据类型

    2024年02月09日
    浏览(60)
  • 一、21.指针类型转换 | 指针的指针 | 指针与常量

    01.指针类型转换

    2024年02月06日
    浏览(38)
  • 初级Java必看的数据类型与常量变量

    目录 一、Java的数据类型 1、数据类型细致划分 2、数据类型他是做什么的? 3、怎么用数据类型? 二、Java的常量与变量 Java常量 常量代表程序在运行过程中,不可再次改变的值; Java变量 知识总结         我们所学的Java,最基础的应该就是数据类型了,应该大部分计算机

    2024年01月19日
    浏览(56)
  • 【go语言】2.1.1 变量,常量和数据类型

    Go 语言中,变量是存储数据的基本单位,常量则是固定不变的数据。每个变量和常量都有其对应的数据类型。 在 Go 语言中,你可以使用  var  来声明一个变量: 上面的代码声明了一个名为  name  的变量,它的类型是  string 。你也可以在声明变量的同时给它赋值: 或

    2024年02月15日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包