首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么枚举有一个包私有构造函数?

枚举是一种特殊的类,用于表示一组固定的常量值。在Java中,枚举类型是一种独特的类,它继承自java.lang.Enum类。枚举类型具有一组预定义的常量值,这些值通常是大写字母和下划线组成的标识符。每个枚举常量都是枚举类型的一个实例。

在枚举类型中,包私有构造函数是为了确保该类型的实例只能通过预定义的常量值来创建。这是因为枚举类型的实例应该是唯一的,以确保它们可以用于比较和 switch 语句。

例如,假设我们有一个表示颜色的枚举类型:

代码语言:java
复制
public enum Color {
    RED,
    GREEN,
    BLUE
}

在这个例子中,REDGREENBLUE是预定义的枚举常量,它们是Color类型的实例。由于构造函数是私有的,我们不能通过调用构造函数来创建新的实例:

代码语言:java
复制
// 这将导致编译错误,因为构造函数是私有的
Color yellow = new Color("YELLOW");

这就是为什么枚举类型具有私有构造函数的原因。这种设计确保了枚举类型的实例是唯一的,并且可以安全地用于比较和 switch 语句。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

每天一个小技巧:Javascript中定义私有属性(Private Properties) IIFE 实现构造函数实现Class实现原生实现

IIFE 实现 IIFE(立即执行函数) 大家应该耳熟能详了,IIFE 经常被用来: 定义一个自执行的匿名函数 创建一个局部作用域,避免对全局产生污染 基于以上特性,用 IIFE 可以给一个对象实现简单的私有属性...name'] person.greet(); // hi, i'm frank and i'm 30 years old IIFE 的实现简单易懂,但是只能作用于单个对象,而不能给 Class 或者构造函数定义私有属性...构造函数实现 利用在构造函数中创建的局部变量可以作为 “私有属性” 使用: function Person(name, age) { // 私有属性 let _name = name;...Class实现 Class中实现和构造函数类似,因为JavaScript中的class本质上是构造函数和原型的语法糖,实现如下: class Person { constructor(name, age...这和一般意义上的私有属性还是有差别的,真正的私有属性在class内部应该是可以正常访问的,而不仅仅是在构造函数内部可以访问。

1.3K20

答网友提问:为什么语句 var oModel = this.stub() 是构造一个stub对象? stub()是一个函数,从哪里来的?

解答 打开 Chrome 开发者工具的 Sources 面板,找到 formatter.js 文件,我们把鼠标放在 formatter.js 文件上, 就会看到一个弹出框,上面的字段 FunctionLocation...显示了这个 stub 函数的实现位置,位于 sinon.js 文件里。...sinon 是一个著名的前端测试 Mock 框架,在笔者的汪子熙纪念特洛伊英雄 Sinon - SAP UI5 Mock Server 使用步骤和工作原理介绍里有详细介绍。...我们在第 20 行代码设置断点: 然后点击 Chrome 调试器的 Step Into 按钮,或者快捷键 F11,进入 stub 函数内部: 从而进入 sinon.js 文件的 stub 函数实现内部...,这里使用了 JavaScript function 原型链上的原生方法 apply 来调用函数

60520

枚举与联合

1.1举的定义 枚举顾名思义就是一一列举。 把可能的取值一一列举。 比如我们现实生活中: 一周的星期一到星期日是有限的 7 天,可以一一列举。...例如: enum Color//颜色 { RED=1, GREEN=2, BLUE=4 }; 1.2举的优点 为什么使用枚举?...我们可以使用 #define 定义常量,为什么非要使用枚举? 枚举的优点: 1. 增加代码的可读性和可维护性 2. 和#define定义的标识符比较枚举有类型检查,更加严谨。...使用方便,一次可以定义多个常量 1.3举的使用 enum Color//颜色 { RED=1, GREEN=2, BLUE=4 }; enum Color clr = GREEN;//只能拿枚举常量给枚举变量赋值...}; //联合变量的定义 union Un un; //计算连个变量的大小 printf("%d\n", sizeof(un));//4 2.2联合体的特点 联合的成员是共用同一块内存空间的,这样一个联合变量的大小

9610

Effective Java tips

私有化类构造器 每个方法抛出的异常都要有文档 Stream使用注意事项(与直接使用hashMap的区别) value值不能为null, 避免转换时key重复导致的Duplicate key错误 不能重复使用...当设计类的构造方法或静态工厂的参数超过几个时,Builder 模式是一个不错的选择,特别是许多参数是可选的或相同类型的。...builder 模式客户端代码比使用伸缩构造方法(telescoping constructors)更容易读写,并且 builder 模式比 JavaBeans 更安全 使用私有构造方法或类实现 Singleton...然而,有时需要私有私有内部类来暴露属性,无论此类是否是可变的 最小化可变性,不可变类比可变类更易于设计,实现和使用。他们不容易出错,并且更安全。...即使如此,如果子类与父类不在同一个中,并且父类不是为继承而设计的,继承可能会导致脆弱性。为了避免这种脆弱性,使用组合和转发代替继承,特别是如果存在一个合适的接口来实现包装类。

26620

字节跳动凉面(抖音C++)(问题+解答)

9、父类的析构函数为什么最好声明为虚函数     (防止析构时内存泄漏) 10、接上个问题,什么情况会发生内存泄漏,举例  (当子类有比父类多的数据成员,特别是子类有创建于堆上的数据时,若用父类指针指向子类对象...,父类析构函数如果不是虚函数,运行时父类析构函数执行而子类析构函数不执行,子类多的内存无法释放) 11、构造函数里面可以调用虚函数吗?...在基类构造函数调用虚函数、子类构造函数里调用虚函数分别分析,无法实现动态绑定) 12、new和malloc的区别,new的底层过程是怎样的 13、C和C++里static各有什么作用 (static...假设有一硬币,质地不均匀,抛掷一次 出现正面的概率是p (p不为1/2),但p是多少我们是不知道的。...假设A B两个人玩游戏,我们规定这样一个规则:抛掷这硬币1次,正面向上则A获胜,反面则B胜,显然这个规则是不公平的,因为p不是1/2。

1.8K00

单例设计模式(javascript版)2

//单例模式思想 //让构造函数私有化就能比如是吧,因为一些原因比如你成绩不到,,不能入人大附中啊所以你应不应该走后门啊, //因为对象在类里面,所以外面是类.方法啊 //思路是先自执行一次...方法不能访问,因为是私有构造方法 // //要访问函数内部。因为是在内部定义的。...因为i把他看成了私有构造方法了 //然后是自执行的,()()会不同,,所以这样, //然后看看闭里面如果没有值就创建,然后是并初始化,然后是 //因为if里面只能执行一次,所以是在外面先返回到首部,然后是返回到最下面完成...private,因为js里面没有,因为把他当作也行把,唉 核心:单例模式的关键在于不能让外部使用者 new 出对象,即构造函数是 private 为什么构造函数是 private?...因为不能让外部创建类的对象,为什么,? 因为单例的关键就是只有一个实例,我举个例子把,比如我写的购物车是不是我的购物车只能我才能知道里面到底有什么啊 ?

25040

一句话读懂原型 、原型链(__proto__、prototype)

先属性明确几个概念 prototype: 原型,函数一个属性,它本身就是一个对象 {} __proto__: 原型链,通过 __proto__ 可以把互相继承的对象的原型链接起来...__proto__ === Person.prototype // true /** * 解释: * - person1 对象具有__proto__属性和 Person 构造函数。...__proto__)指向 person1 的构造函数(Person)的原型对象(Person.prototype) */ 而 prototype 是函数才有的属性,它指向该函数的原型对象(Person.prototype...) 原型链 MDN上的总结:每个实例对象(object)都有一个私有属性(称之为 __proto__)指向它的构造函数的原型对象(prototype)。...__proto__ === null) // true 写在最后 我是 AndyHu,目前暂时是一前端搬砖工程师。

23130

大数据必学Java基础(八十七):枚举的深入了解

​枚举的深入了解一、引入1、数学:枚举法1<x<42<y<5求x+y=6举法:一的列举出来。前提:有限,确定2、在java中,类的对象是有限个,确定的。...: //构造私有化,外界不能调用这个构造器,只能Season内部自己调用 private Season(String seasonName,String seasonDesc){...: //构造私有化,外界不能调用这个构造器,只能Season内部自己调用 private Season(String seasonName, String seasonDesc){...java.lang.Enum }}在源码中经常看到别人定义的枚举类形态:public enum Season { SPRING, SUMMER, AUTUMN, WINTER;}为什么这么简单...:因为这个枚举类底层没有属性,属性,构造器,toString,get方法都删掉不写了,然后案例来说应该写为:SPRING() 现在连()可以省略 就变成 SPRING看到的形态就剩:常量名(对象名

32551

【C语言】enum 关键字

收藏⭐️ + 留言​ 系列专栏-【C语言】关键字_謓泽的博客-CSDN博客 ✉️我们并非登上我们所选择的舞台,演出并非我们所选择的剧本 ⑩① enum ⇿ 枚举类型 ⒈描述⇢声明外部变量和函数是一种基本...定义-enum    枚举名    {枚举元素1,枚举元素2,……}; ⒉注意⇢第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加1。...和#define相比定义的标识符比较枚举有类型的检查,更加具有严谨性。 便于程序当中调试。 使用比较方便,依次就可以定义多个枚举常量。 封装性好。...②问:为什么我不可以直接去定义,还需要用枚举,这不是多此一举吗? 答:结论你最终用所谓的整形或者是用所谓的枚举,当然这个实际上在C的编译器都是可以支持的。...拓展知识点↔常量不多且没有上面相关性可以使用宏定义,反之用枚举。

51820

深入理解JavaScript闭之闭的使用场景

只能在函数内部访问,函数外面是访问不到它们的。但是如果在函数内部创建一个,闭可以通过自己的作用域链就可以访问这些变量。所以利用闭,我们就可以创建用于访问私有变量的公有方法(也称为特权方法)。...能够在构造函数中定义特权方法,是因为特权方法作为闭有权访问在构造函数中定义的所有变量和函数。...getName(),这个方法可以在构造函数外面使用,可以通过它访问内部的私有变量name。...因为该方法是在构造函数内部定义的,作为闭可以通过作用域链访问name。私有变量 name在 Foo的每个实例中都不一样,因此每次调用构造函数都会重新创建该方法。...,属于私有变量,但是为什么在外部使用的时候给value赋值,还是能达到修改变量的目的呢。

1.1K20

一起学JAVA 反射学习(超详细)

反射非常强大,它甚至能直接操作程序的私有属性。我们前面学习都有一个概念,被private封装的资源只能类内部访问,外部是不行的,但这个规定被反射赤裸裸的打破了。...反射就像一面镜子,它可以在运行时获取一个类的所有信息,可以获取到任何定义的信息(包括成员变量,成员方法,构造器等),并且可以操纵类的字段、方法、构造器等部分。 2 为什么需要反射?...如果想创建对象,我们直接new User(); 不是很方便嘛,为什么要去通过反射创建对象呢? 那我要先问你个问题了,你为什么要去餐馆吃饭呢?...Class[] pt = c.getParameterTypes();//通过本轮遍历到的构造函数对象获取构造函数的参数类型 System.out.println...* 思路: * 1.先获取指定的构造函数对象,注意需要指定构造函数的参数,传入的是.class字节码对象 * 2.通过刚刚获取到的构造函数对象创建Student目标类的对象,并且给对象的属性赋值 *

27120

Java枚举单例模式比DCL和静态单例要好?———反编译分析单例枚举类

1.2 singleton为什么要加上volatile关键字? 主要原因就是 singleton = new Singleton();不是一个原子操作。...在JVM中,这句语句至少做了3件事 1.给Singleton的实例分配内存空间; 2.调用Singleton()的构造函数,初始化成员字段; 3.将singleton指向分配的内存空间(此时singleton...,枚举类里的各个枚举项是是通过static代码块来定义和初始化的(可以见后面3.2节反编译分析单例枚举有分析到这个),它们会在类被加载时完成初始化,而java类的加载由JVM保证线程安全,所以,创建一个...即使构造函数私有的,反序列化时依然可以通过特殊的途径去创建类的一个新的实例,相当于调用该类的构造函数。...public void testMethod(); static {}; } 我们可以看到, INSTANCE是Singleton类的实例 Singleton继承了java.lang.Enum类 这里还有一个私有

57210

【JavaSE专栏23】Java反射有多强? 他拥有这五大神奇功能!

作者主页:Designer 小郑 作者简介:Java全栈软件工程师一,来自浙江宁波,负责开发管理公司OA项目,专注软件前后端开发(Vue、SpringBoot和微信小程序)、系统定制、远程技术指导...在 Java 中,对于任意一个运行中的对象,可以调用该对象的任意属性和方法;已知一个类,可以获取这个类的所有属性和方法,这就是反射机制。...一般情况下,根据面向对象封装原则,Java实体类的属性都是私有的,我们不能获取类中的属性。但我们可以根据反射,获取私有变量、方法、构造器,甚至是注解。...在最近的项目开发中,有一个需求:将人员档案的 80+ 个字段,设置部分为隐私字段,比如有权限可以看,权限需要动态分配。...user.getClass(); // 类完整路径 String className = userClass.getName(); // 路径

27280

三大JS设计模式(工厂 单例 适配器)模式。通俗易懂理解等你来理解

,(我并不需要知道怎么做哈) //单例模式思想 //让构造函数私有化就能比如是吧,因为一些原因比如你成绩不到,,不能入人大附中啊所以你应不应该走后门啊, //因为对象在类里面,所以外面是类.方法啊....函数然后是返回到最上面,然后是调用login然后执行 /**/ //先有类才有对象 /*class SingleObject { //因为js中没有私有,所以把他看成私有的把...方法不能访问,因为是私有构造方法 // //要访问函数内部。因为是在内部定义的。...因为i把他看成了私有构造方法了 //然后是自执行的,()()会不同,,所以这样, //然后看看闭里面如果没有值就创建,然后是并初始化,然后是 //因为if里面只能执行一次,所以是在外面先返回到首部,然后是返回到最下面完成...private,因为js里面没有,因为把他当作也行把,唉 核心:单例模式的关键在于不能让外部使用者 new 出对象,即构造函数是 private 为什么构造函数是 private 因为不能让外部创建类的对象

62030

JavaScript的封装

}else { throw new Error("年龄必须是在0到150范围内"); } } //(2)写一个构造函数...,还有更为复杂是业务需要封装,使用get和set方法时,需要一个构造函数用于两者先后顺序的初始化实现闭,之后显示调用,确保set是在get之前的。...(2)闭的实现,是通过get和set实现的,this.方式赋值时没有暴露在外面而是通过get,set方法实现闭。 二,静态化 普通属性和函数是作用在对象上到,而静态函数是定义到类上的。...第二种静态函数的写法 :使用类中类的方式完成每一个对象全拥有当前类中相同的属性和函数 。...,与一个返回可以初始化本类私有静态属性和方法的类,该类我们称为类中类。

49310

javaScript 递归 闭 私有变量

  闭是指有权访问一个函数作用域中的变量的函数。     ...:         // 在函数内部返回一个匿名函数,匿名函数能够访问fun 函数的的变量         return function(){           return privateVal;...        }      }      fun()(); // 第一个() 执行了fun 函数,返回值是一个匿名函数,第二执行了匿名函数。...     // 以下代码,等同于fun()();      var temFun=fun();      console.log(temFun()); // 输出:"private value"    闭只能取得包含函数中任何变量的最后一个值...  创建私有变量的方法     1.构造函数     function Person(name){       this.getName = function(){         return name

52030
领券