首页
学习
活动
专区
工具
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.7K21

枚举与联合

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联合体的特点 联合的成员是共用同一块内存空间的,这样一个联合变量的大小

11710
  • Effective Java tips

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

    28620

    字节跳动凉面(抖音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?...因为不能让外部创建类的对象,为什么,? 因为单例的关键就是只有一个实例,我举个例子把,比如我写的购物车是不是我的购物车只能我才能知道里面到底有什么啊 ?

    26340

    一句话读懂原型 、原型链(__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,目前暂时是一前端搬砖工程师。

    28230

    【数据结构】反射,枚举你必须知道的相关知识

    ,由于为私有属性所以得“授权”,然后进行实例化,改变这个私有构造方法的内容,最后实现打印。...对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法 2. 增加程序的灵活性和扩展性,降低耦合性,提高自适应能力 3....注意:枚举的构造方法为私有方法,在编写构造方法时,为私有权限符,但是这里可以进行省略 2.3举的总结 优点: 枚举常量更加简单和安全 枚举具有内置接口,代码更加简洁优美 缺点: 无法进行继承...,不能进行扩展 ️3.反射和枚举的关系 在上述讲解中,我们知道了关于反射机制,又由于枚举的构造方法是私有的,那么我们可以通过反射来拿到枚举的实例对象呢?...继承了父类除构造函数外的所有东西,并且子类要帮助父类进行构造而我们写的类,并没有帮助父类构造

    12410

    大数据必学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看到的形态就剩:常量名(对象名

    34551

    【C语言】enum 关键字

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

    57820

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

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

    1.2K20

    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类 这里还有一个私有

    61410

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

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

    30220

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

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

    29980

    【Java数据结构】反射、枚举以及lambda表达式

    ,包括私有(返回一个数组) getDeclaredMethod(方法名,int.class,String.class) //获取指定包括私有 获取构造方法 getConstructor(参数类型列表...) //获取公开的构造方法 getConstructors() //获取所有的公开的构造方法(返回一个数组) getDeclaredConstructors() //获取所有的构造方法,包括私有...,就要多加一个代码: method.setAccessible(true); 2.35 使用类中的构造方法 这里我们使用一个类中的私有构造方法,跟前面大不相同。 ​...color = Color.RED; int n = color.compareTo(Color.BLUE) ;//0 减 2 System.out.println(n); 3.3举的构造方法...,哪怕其构造方法是私有的,我们也可以通过反射拿到他的实例对象,那么枚举的构造方法也是私有的,我们是否可以拿到呢?

    7710

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

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

    63330
    领券