无论在 Java 还是 Kotlin 中,枚举的功能和消耗本质上都是一样的。有趣的地方在于引入了 R8 之后,我们能对其中的一些开销做些什么。 枚举本身不包含任何隐藏开销。 但当您配合枚举使用 when 语句时,就会引入额外的开销。 所以取而代之的是,编译器将序数值与另一个值做映射,这样一来,无论您对这些枚举做什么修改,基于这个库的代码都能正常运行。 当然,这就意味着只要像这样使用枚举,就会额外生成其它内容。 使用 R8 来解决问题 R8 是一个有趣的优化器,它能 "看" 到与应用相关的所有内容。由于 R8 可以 "看" 到无论是您自己写的还是您依赖的库中的所有代码,它便可以根据这些信息决定做哪些优化。 比如,它能避免枚举映射造成的开销: 它不需要那些映射信息,因为它知道这些代码只会以既定的方式使用这些枚举,所以它可以直接调用序数值。
几乎无法给关联数据添加额外的属性 ? 至今都没有一个可以更加明智地改变ENUM类型字段的方法,这也是我们的常态。在我们的“国家、大陆板块”例子中, 更改“国土面积”会出现什么情况? 如果你担心使用关系表会导致变慢,可以在同一基准下测试不同方式下的表现,再进行考虑。切勿先入为主地认为关联查询会成为瓶颈,可能有时并非如此。 处理上没问题, 但如果我们使用的是带外键的关系表, 那么我们的数据能因健壮性而更加可靠。 同样,MySQL 会为ENUM值关联枚举索引,并且在使用中会错误地调用到索引而不是ENUM值,反之亦然。 但是,即便是这些例子,有时也需要去拓展值的范围(例如有人需要你称呼“陈医生”而不是“陈先生”的时候,或者你的扑克游戏里面需要用到小丑牌)。 2. 你永远不需要存储额外的关联信息 用回扑克牌的例子。 扑克游戏老少咸宜,依赖的规则是梅花和黑桃为黑色,方块和红心为红色(例如,尤克牌)。如果我们需要为花色关联额外的信息,例如颜色,那将如何?
一键领取预热专享618元代金券,2核2G云服务器爆品秒杀低至18元!云产品首单低0.8折起,企业用户购买域名1元起…
ES5 代码可知,默认还是从 0 开始,当发现中间成员重新定义了枚举的初始值,下一个值将从新的初始值开始递增,每次的增量为 1。 字符串枚举的概念很简单,在一个字符串枚举里,每个成员都必须用字符串字面量,或另外一个字符串枚举成员进行初始化。 为了避免在额外生成的代码上的开销和额外的非直接的对枚举成员的访问,我们可以使用 const 枚举。 RequestMethod 枚举生成任何映射代码。 相反,它将在所有使用的地方,内联每个枚举成员的值,从而可能节省一些字节和属性访问间接性的开销。
介绍 这篇文章详细介绍了一个问题,它允许列举付款方式的最后四位数字(例如信用卡或借记卡),并且披露任何给定PayPal账户的账户余额和近期交易。 先决条件和侦察 为了开始攻击,攻击者需要知道与帐户有关的两条信息,这些信息将是与其链接的电子邮件地址和电话号码。 但是,如果第一次提交尝试不正确,则在同一通话期间的后续尝试中,将不会通知主叫方成功提交。这使得在相同的电话呼叫中给予呼叫者的任何额外尝试都是掩饰。 攻击效果和效率 如果前面提到的先决条件已经得到满足,攻击者将毫无疑问地能够列举与帐户关联的付款方式的正确最后四位数字。 一旦攻击者成功地列出了与该账户相关联的信用卡/借记卡或银行账户的最后四位数字,他们就可以随意查询经常账户余额和最近的交易信息。
中间的节点简单地称为非叶节点(nonleaf)。 目标:分成存储于查询,比如:系统字典、组织机构、省份区域等树形结构数据或者以层级方式组织的数据。 邻接表维护树比较方便,但是查询很笨拙,如果要找一个节点下的所有子节点,要关联很多次,这个关联次数取决于树的深度, 所以,邻接表不能用于存储比较深的树。 【 使用CTE通用表表达式来递归查询树形结构数据比较方便,详见“SQL中的CTE通用表表达式” 】 解决方案:使用其他树模型 路径枚举: 用一个path字段保存当前节点的最顶层的祖先到自己的序列 嵌套集: 存储子孙节点的相关信息,而不是节点的直接祖先。 邻接表:简单,但不适用于很深的表; 枚举路径:无法保证引用完整性; 嵌套集:无法保证引用完整性,太复杂; 闭包:需要一个额外的表存储关系;
Outlook安装详细信息,以便构造正确的注册表项并检索编程访问安全设置。 联系人信息枚举(contacts) 枚举每个已配置帐户的联系人并提取以下信息: 完整名称(全名) 电子邮件地址 电子邮件枚举(mails) 枚举每个已配置帐户的邮件并提取以下元数据: ID 时间戳 主题 对象模型保护绕过 由于当前进程是以高级完整权限运行的,因此该工具所提供的“—bypass”选项可以与联系人信息枚举(contacts)、电子邮件枚举(mails)、搜索查询(search)以及数据保存( KnockOutlook将尝试获取当前Outlook安全策略的快照,并以自动允许编程访问安全提示的方式对其进行篡改操作,在操作完成后还会将其恢复为初始状态。 数据输出 KnockOutlook的所有操作都会将基础数据直接输出在屏幕上。 联系人信息枚举(contacts)和电子邮件枚举(mails)操作将会把输出数据以JSON格式保存至gzip压缩文件中。
TypeScript 提供数字和基于字符串的枚举。 Numeric enums 我们将首先从数字枚举开始,如果您在其他语言里使用过枚举类型,可能会更熟悉。 可以使用 enum 关键字定义枚举。 除了为成员创建具有属性名称的对象之外,数字枚举成员还获得从枚举值到枚举名称的反向映射。 对其他枚举成员的引用始终作为属性访问发出,并且从不内联。 请记住,字符串枚举成员根本不会生成反向映射。 constenums 在大多数情况下,枚举是一个完全有效的解决方案。 然而,有时要求更严格。 为了避免在访问枚举值时支付额外生成的代码和额外的间接费用,可以使用 const 枚举。 Const 枚举成员在使用站点内联。 这是可能的,因为 const 枚举不能有计算成员。
首先是一个转换用的函数,将具体的部位转换成int量 https://docs.python.org/zh-cn/3/library/enum.html Python内的枚举很少见,我查一下 枚举是与多个唯一常量值绑定的一组符号名 枚举中的成员可以进行身份比较,并且枚举自身也可迭代。 ? 枚举是由 class 句法创建的,这种方式易读、易写。 ? 还有互逆的操作 ? 这个是设置装甲的灵敏度,这个不懂是如何实现的。 带有额外状态的回调函数,异步回调 这里带额外信息的回调函数是print_result。 注意:这里print_result只能接收一个result的参数,不能传入其他信息。 麦轮的全向移动是在每一个麦轮的滚子单独接触地面时分解速度实现的,也就是说如果在崎岖不平的地面就会造成无法分解速度,从而无法横向移动,所以麦轮自身路面要求比较高。所以,就没有普及开来 ? 这个底盘也有一个陀螺仪的信息~陀螺仪的作用是稳定 ? 这段代码好有趣,未来SDK一定要集成这段 ? 显示车辆当前的速度分量
四、如何理解装饰器的作用 在 TypeScript 中装饰器分为类装饰器、属性装饰器、方法装饰器和参数装饰器四大类。装饰器的本质是一个函数,通过装饰器我们可以方便地定义与对象相关的元数据。 每个枚举成员都有一个 name 和一个 value。数字枚举成员值的默认类型是 number 类型。 如果枚举中某个成员的值使用显式方式赋值,但后续成员未显示赋值, TypeScript 会基于当前成员的值加 1 作为后续成员的值。 另外,对于纯字符串枚举,我们不能省略任何初始化程序。而数字枚举如果没有显式设置值时,则会使用默认值进行初始化。 以上提到的这些问题,相信一些小伙伴们在学习 TS 过程中也遇到了。如果有表述不清楚的地方,欢迎你们给我留言或直接与我交流。之后,阿宝哥还会继续补充和完善这一方面的内容,感兴趣的小伙伴可以一起参与哟。
有关默认值如何在生成的代码中工作的更多详细信息,请参阅所选语言的生成代码指南。 枚举 当你定义一个消息的时候,你可能希望它其中的某个字段一定是预先定义好的一组值中的一个。 有关如何enum在应用程序中使用消息的详细信息,请参阅所选语言的生成代码指南。 保留值 如果通过完全删除枚举条目或将其注释掉来更新枚举类型,则未来用户可以在对类型进行自己的更新时重用该数值。 除了一个共享内存中的所有字段之外,其中一个字段类似于常规字段,并且最多可以同时设置一个字段。设置oneof的任何成员会自动清除所有其他成员。 您可以在相关API参考中找到有关所选语言的oneof API的更多信息。 Oneof特性 设置oneof字段将自动清除oneof的所有其他成员。 Maps 如果要在数据定义中创建关联映射,protobuf提供了一种方便的快捷方式语法: map < key_type ,value_type > map_field = N ; 这里key_type可以是任意整形或者字符串
(比如基础类型) 无法继承或实现类型别名(也不能扩展或实现其它类型),但接口可以 类型别名能将多个类型组合成一个具名类型,而接口无法描述这种组合(交叉、联合等) // 类型组合,接口无法表达这种类型 type 三.枚举与字面量类型 我们知道有一种特殊的枚举叫联合枚举,其成员也具有类型含义,例如: // 联合枚举 enum E { Foo, Bar, } // 枚举的类型含义 function f(x .数值枚举 从类型角度来看,联合枚举就是由数值/字符串字面量构成的枚举,因此其成员也具有类型含义。 名称上也表达了这种联系:联合枚举,即数值/字符串联合 P.S.枚举成员类型与数值/字符串字面量类型也叫单例类型(singleton types): Singleton types, types which 能够满足完整性覆盖要求,但需要额外定义一个assertNever函数 P.S.关于Never类型的更多信息,见基本类型_TypeScript笔记2 此外,还有一种不那么准确,但也有助于检查完整性的方法:
const enum高效的编译时内联 官方文档明确写出“大多数情况下,枚举是十分有效的方案。 然而在某些情况下需求很严格。 为了避免在额外生成的代码上的开销和额外的非直接的对枚举成员的访问,我们可以使用 const枚举”,那是为什么呢? 说白了就是假如仅仅通过通过const enum定义了枚举类型而没有其它地方调用,这段代码将在编译时被直接抹掉。 当其它地方调用该枚举类型时,将直接把枚举类型成员的值内联到使用处,如下: const enum Response { No, Yes, } console.log(Response.NO 为我们提供语言实现和编译时优化,除了保护了我们为如何优化实现枚举类型而日思夜想导致日渐稀疏的头发外,还大大降低了因复制粘贴带来的代码库体积徒增的风险。
;后来,随着以 protobuf 为首的一系列工具的诞生,处理数据结构的变化变得不那么繁琐:程序员只要依照一定的要求,数据本身可以很方便地在多个版本的软件中兼容。 定义好出错码骨架之后我们可以为其实现 error::Error — 这就是见证奇迹的地方:我们通过一套定义实现了内部和外部出错码的统一。 枚举类型 软件项目中,有大量的数据结构是枚举类型。 proto 文件可以都属于同一个 package,比如 common,但代码可以通过不同的文件拆分;而生成的代码,可以通过 re-export 将其放置于不同的命名空间下,方便管理。 在 rust 下,为了方便 prost 编译出的 protobuf 的枚举类型的各种应用,我会在 build.rs 里加一些小的 hack,比如下面的代码: /// supported platforms 比如用户模块,用户的基本信息相关的结构,就可以用 protobuf 来定义: // basic user informationmessage User { // user id string id
,再通过外部类的实例调用内部类的构造函数,也就是把内部类作为外部类的一个成员对象来使用,这与成员属性、成员方法的调用方法类似。 因此,Kotlin摒弃了“枚举类型”那种模糊不清的说法,转而采取“枚举类”这种正本清源的提法。具体到编码上,则将enum作为关键字class的修饰符,使之名正言顺地成为一个类——枚举类。 WINTER } 枚举类内部的枚举变量,除了可以直接拿来赋值之外,还可以通过枚举值的几个属性获得对应的信息,例如ordinal属性用于获取该枚举值的序号,name属性用于获取该枚举值的名称。 然而这些任务其实毫无技术含量可言,如果每天都在周而复始地敲实体类的相关编码,毫无疑问跟工地上的搬砖民工差不多,活生生把程序员弄成一个拼时间拼体力的职业。 那么如果某个泛型函数在类内部定义,即变成了这个类的成员方法,又该如何定义它呢?
在一个字符串枚举里,每个成员都必须用字符串字面量,或另外一个字符串枚举成员进行初始化。 ,我们可以知道数字枚举除了支持 从成员名称到成员值 的普通映射之外,它还支持 从成员值到成员名称 的反向映射: enum Direction { NORTH, SOUTH, EAST, 而数字枚举如果没有显式设置值时,则会使用默认规则进行初始化。 3.常量枚举 除了数字枚举和字符串枚举之外,还有一种特殊的枚举 —— 常量枚举。 它是使用 const 关键字修饰的枚举,常量枚举会使用内联语法,不会为枚举类型编译生成任何 JavaScript。 TypeScript 运行环境,利用它你可以方便地学习 TypeScript 相关知识与不同版本的功能特性。
()); 另外,枚举类型都实现了Java API中的Comparable接口,都可以通过方法compareTo与其他枚举值进行比较,比较其实就是比较ordinal的大小,例如,如下代码输出为-1,表示 valueOf方法调用的是父类的方法,额外传递了参数Size.class,表示类的类型信息,类型信息我们后续文章介绍,父类实际上是回过头来调用values方法,根据name对比得到对应的枚举值的。 典型场景 用法 以上枚举用法是最简单的,实际中枚举经常会有关联的实例变量和方法,比如说,上面的Size例子,每个枚举值可能有关联的缩写和中文名称,可能需要静态方法根据缩写返回对应的枚举值,修改后的Size ,比如说,每个枚举值可以有关联的类定义体,枚举类型可以声明抽象方法,每个枚举值中可以实现该方法,也可以重写枚举类型的其他方法。 小结 本节介绍了枚举类型,介绍了基础用法、典型场景及高级用法,不仅介绍了如何使用,还介绍了实现原理,对于枚举类型的数据,虽然直接使用类也可以处理,但枚举类型更为简洁、安全和方便。
举个例子,如果要描述一辆汽车,可以把汽车这个对象封装起来,定义一个Car结构体,而汽车包含了很多信息,有型号、价格、油量、性能、甚至汽车的构造等等,将这些属性封装到汽车Car结构体中,不仅让人一目了然, 首先得掌握结构体的对齐规则: 第一个成员在与结构体变量偏移量为0的地址处。 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。 对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。 那在设计结构体的时候,我们既要满足对齐,又要节省空间,如何做到:只需要把小内存的变量放在前面,让占用空间小的成员尽量集中在一起,即可。 2.位段的成员名后边有一个冒号和一个数字。 2 枚举 枚举顾名思义就是一一列举。 把可能的取值一一列举。 比如我们现实生活中: 一周的星期一到星期日是有限的7天,可以一一列举。 防止了命名污染(封装) 便于调试 使用方便,一次可以定义多个常量 3 联合(共用体) 3.1 联合类型的定义 联合也是一种特殊的自定义类型 这种类型定义的变量也包含一系列的成员,特征是这些成员公用同一块空间
我知道你正在想什么:如果类型只有一个,那么怎么能知道异常具体是什么?我将如何追踪具体的属性?请继续阅读。 2. 使用枚举错误码 我们大多被教授的方法是将异常转为错误信息。 这次查看日志文件时很好,(呃)但是这样也有缺点: 错误信息不会被翻译(除非你是Google) 错误信息不会转换为用户友好的文字 错误信息不能用编程的方式检测 将异常消息留给开发者定义也会出现同样的错误有多种不同的描述 key就可以方便地提供友好的国际化文本。 你可以直接使用枚举里的ordinal()方法或者从文件或数据库加载。 4. 为异常添加动态属性 好的异常处理还应该记录相关数据而不仅仅是堆栈信息,这样可以在诊断错误和重现错误时节省大量时间。 给异常添加正确的信息和将异常放在易于访问的地方可以避免很多灾难事故和时间浪费。如果你有一些自己的异常处理秘诀,欢迎分享。 下载 这里包含了本文的所有代码(包括Eclipse项目)。
我们回想一下上面是如何使用数组来解决的,它存在一个缺陷:我们默认地将订单状态值与数组的索引一一对应地联系了起来。 而当这种对应关系被打破时,使用数组的方法就失效了,因为如果不利用数组索引,我们没有额外的地方去存储状态的数字值。 可我们都知道:枚举enum是一个基本类型,它不会实现任何的接口,那么我们下来该如何做呢? 如果想要遍历这里,首先,我们需要一个包含枚举的每个字段信息的对象,这个对象至少包含两条信息,一个是字段的文本(比如“未提交”),一个是字段的数字型值(比如1),我们暂且管这个对象叫做field。 我在后面将较详细地介绍 Type类,现在只希望你能对反射有个第一印象,所以只简略地作以说明:Type抽象类提供了访问类型元数据的能力,当你实例化了一个Type对象后,你可以通过它的属性和方法,获取类型的元数据信息
依托腾讯自身媒体业务数据中台技术优势与海量数据运营的经验,全面打造“融媒数据中台”解决方案,以数据驱动业务,助力媒体融合发展。
扫码关注云+社区
领取腾讯云代金券