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

为什么enum的构造函数不能访问静态字段?

在Java中,枚举类型(enum)是一种特殊的类,它是由Java编译器自动生成的。枚举类型的构造函数是私有的,因此不能被外部代码访问。这是为了确保枚举类型中的所有实例都是唯一的,并且在类加载时就被初始化。

当您尝试在枚举类型的构造函数中访问静态字段时,Java编译器会报错,因为静态字段在实例化之前就需要被初始化,而构造函数在实例化过程中被调用。如果您需要在枚举类型中使用静态字段,可以在枚举类型中定义一个静态代码块,并在其中初始化静态字段。

例如:

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

    private static final Map<String, Color> stringToEnum = new HashMap<>();

    static {
        for (Color color : Color.values()) {
            stringToEnum.put(color.toString(), color);
        }
    }

    public static Color fromString(String colorString) {
        return stringToEnum.get(colorString);
    }
}

在上面的例子中,我们定义了一个名为Color的枚举类型,并在其中定义了一个静态字段stringToEnum。我们在静态代码块中初始化了stringToEnum,并提供了一个静态方法fromString,用于将字符串转换为枚举类型的实例。这样,我们就可以在枚举类型中使用静态字段,而不会影响枚举类型的实例化过程。

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

相关·内容

为什么构造函数不能为虚函数

1、从使用角度         虚函数主要用于在信息不全的情况下,能使重载的函数得到对应的调用。构造函数本身就是要初始化实例,那使用虚函数也没有实际意义呀。所以构造函数没有必要是虚函数。...虚函数的作用在于通过父类的指针或者引用来调用它的时候能够变成调用子类的那个成员函数。而构造函数是在创建对象时自动调用的,不可能通过父类的指针或者引用去调用,因此也就规定构造函数不能是虚函数。...2、从实现上看,vbtl在构造函数调用后才建立,因而构造函数不可能成为虚函数    从实际含义上看,在调用构造函数时还不能确定对象的真实类型(因为子类会调父类的构造函数);而且构造函数的作用是提供初始化...而且,只要它是最后的构造函数调用,那么在这个对象的生命期内, V P T R将保持被初始化为指向这个V TA B L E, 但如果接着还有一个更晚派生的构造函数被调用,这个构造函数又将设置V P T R...V P T R的状态是由被最后调用的构造函数确定的。这就是为什么构造函数调用是从基类到更加派生 类顺序的另一个理由。

2.3K91

为什么应该尽可能避免在静态构造函数中初始化静态字段?

如下所示的两段IL代码分别来源于Foo和Bar,我们可以看到虽然Foo类中没有显式定义静态构造函数,但是编译器会创建一个默认的静态构造函数,针对静态字段的初始化就放在这里。...从Foo和Bar的IL代码可以看出,针对它们静态字段的初始化都放在静态构造函数中。...但是当我们调用一个并不涉及类型静态字段的Invoke方法时,定义在Foo中的静态构造函数会自动执行,但是定义在Bar中的则不会,由此可以看出一个类型的静态构造函数的执行时机与类型是否具有beforefieldinit...具有beforefieldinit标记:静态构造函数会在第一次读取任何一个静态字段之前自动执行,这相当于一种Lazy loading的模式; 不具有beforefieldinit标记:静态构造函数会在如下场景下自动执行...,所以我们自行定义的专门用来初始化静态字段的静态构造函数是完全没有必要的。

18810
  • 为什么不允许使用 Java 静态构造函数?

    不允许使用 Java 静态构造函数,但是为什么呢?在深入探讨不允许使用静态构造函数的原因之前,让我们看看如果要使 构造函数静态化 会发生什么。...由于构造函数不是类属性,因此有理由认为它不能是静态的。 静态块 / 方法无法访问非静态变量 我们知道静态方法不能访问非静态变量。静态块也是如此。 现在,构造函数的主要目的是初始化对象变量。...因此,如果我们将构造函数设置为静态,则无法初始化对象变量。这将破坏使用创建对象的构造函数的全部目的。因此,使构造函数为非静态是合理的。 注意,我们不能this在静态方法中使用引用对象变量。...下面的代码将定义编译错误,因为:不能在静态上方中使用它。...因此,如果构造函数转换静态,我们将无法使用它,这将破坏java中的继承性。 正是金九银十跳槽季,为大家收集了2019年最新的面试资料,有文档、有攻略、有视频。

    3.1K80

    类的实例化顺序:静态数据、构造函数和字段的执行顺序详解

    引言 在面向对象编程中,类的实例化是一个重要的概念。当我们创建一个类的实例时,其中涉及到多个步骤,包括父类和子类的静态数据初始化、构造函数的执行以及字段的初始化。...这些静态数据在整个类层次结构中只会初始化一次。 父类的构造函数:接着,父类的构造函数会被调用。父类的构造函数可能会执行一些初始化操作,例如设置实例字段的默认值。...子类的静态数据初始化:在父类的静态数据初始化完成后,子类的静态数据也会被初始化。同样,这些静态数据在整个类层次结构中只会初始化一次。 子类的构造函数:最后,子类的构造函数被调用。...子类的构造函数通常会首先调用父类的构造函数,然后执行子类自己的初始化操作。 字段的初始化:在构造函数执行期间,类的实例字段(非静态字段)会被初始化。...实例化顺序总结 通过上述示例和步骤分析,我们可以总结类的实例化顺序如下: 父类的静态数据初始化。 父类的构造函数,包括父类的字段初始化。 子类的静态数据初始化。

    85920

    为什么final引用不能从构造函数内“逸出”

    前面我们提到过,写final域的重排序规则可以确保:在引用变量为任意线程可见之前,该引用变量指向的对象的final域已经在构造函数中被正确初始化过了。...其实要得到这个效果,还需要一个保证:在构造函数内部,不能让这个被构造对象的引用为其他线程可见,也就是对象引用不能在构造函数中“逸出”。...这里的操作2使得对象还未完成构造前就为线程B可见。...即使这里的操作2是构造函数的最后一步,且即使在程序中操作2排在操作1后面,执行read()方法的线程仍然可能无法看到final域被初始化后的值,因为这里的操作1和操作2之间可能被重排序。...比如被final修饰的方法,JVM会尝试为之寻求内联,这对于提升Java的效率是非常重要的。因此,假如能确定方法不会被继承,那么尽量将方法定义为final的。

    51300

    java的静态属性,静态块,构造函数的执行顺序

    今天为了搞清楚实例化一个对象时其属性等的实例化顺序,写了下面的例子来探究: 实例化一个C的对象,其中,A为其静态属性,B为其普通属性;D为C的父类,E为D的静态属性,F为D的普通属性;C中还包含了静态代码块和普通代码块.../** * 静态代码块先于构造器执行 普通块先于构造块 只执行一次 * 凡是静态的与对象无关,先于对象存在的; 凡是静态的都是共享的 */ B b = new B(); static...public C(){ System.out.println("构造函数C"); } } 运行结果: -------第1次实例化------- 父类的静态属性E 构造静态属性A 静态代码块...父类的普通属性F 构造父类D 构造普通属性B 普通代码块 构造函数C -------第2次实例化------- 父类的普通属性F 构造父类D 构造普通属性B 普通代码块 构造函数...C 结论(实例化顺序): 父类静态的属性 父类静态的代码块 子类静态的属性 子类静态的代码块 父类普通属性 父类普通代码块 父类构造函数 子类普通属性 子类普通代码块 子类构造函数 静态的东西只在第一次实例化的时候执行

    1.1K60

    静态代码块、构造代码块以及构造函数的加载顺序

    构造代码块,和构造函数都存在于一个类中,只不过,他们执行的先后顺序和执行的次数不同。...构造函数:构造函数的命名必须和类名完全相同,它没有返回值,也不能用void来修饰。 执行顺序优先级:静态块>main()>构造块>构造方法。...加载的时候,将静态成员变量(类变量),构造代码块,静态代码块以及静态方法加载到方法区的静态部分,非静态方法以及构造方法加载到方法区的非静态部分。...接着开始在堆内存中对实例变量进行默认初始化, 然后执行构造代码块,对object进行对应的构造代码块的初始化, 最后进行构造函数的初始化,对object进行对应的构造函数初始化。...作用分析 静态代码块用于给类初始化,类加载的时候就会被执行; 构造代码块用于给对应对象初始化,只要创建对象就会被执行,而且执行的顺序优先于构造函数; 构造函数用于给对应对象初始化,只要创建对象,就会选择相应的构造函数进行初始化

    73320

    Nginx 不能访问 (找不到)Django 静态文件的原因

    配置) 现象 访问静态文件 网页状态码为:404 首先要用 F12,查看 静态文件的路由,然后用 这个路由 去 静态文件目录 找这个文件是否存在。.../static_root) Nginx 配置静态文件路径没使用 django 项目的 settings.py 里的 STATIC_ROOT 指向的目录 Nginx 的配置规则屏蔽了 js、css 等结尾的静态文件...django 项目的 settings.py 里的 STATIC_ROOT 不是独立的目录,确保是独立的目录而不是 py 语句(如:STATIC_ROOT = 'static_root/' ,然后重新收集静态文件...755 /root/home/djangoprojects/djangoblog) 静态文件对应的路径下,文件不存在(路由没错,文件不存在,可能是没有收集到 static_root 目录下,重新收集静态文件...:python manage.py collectstatic) 静态文件对应的路由拼错了(路由错了,文件存在) 静态文件配置 静态文件管理官网文档 https://docs.djangoproject.com

    3.1K30

    idea中JSP页面不能访问静态资源(图片,js,css) 的作用

    必须配置SpringMvc对访问静态资源的支持,idea默认就是在main/webapp 下的文件路径,要在web-info同级的resource文件下放置,JSP中 ${pageContext.request.contextPath...的作用   优雅REST风格的资源URL不希望带 .html 或 .do 等后缀.由于早期的Spring MVC不能很好地处理静态资源,所以在...进行筛查,如果发现是静态资源的请求,就将该请求转由Web应用服务器默认的Servlet处理,如果不是静态资源的请求,才由DispatcherServlet继续处理。...在接收到静态资源的获取请求时,会检查请求头的Last-Modified值,如果静态资源没有发生变化,则直接返回303相应状态码,提示客户端使用浏览器缓存的数据,而非将静态资源的内容输出到客户端,以充分节省带宽...js这两个资源目录,在images下面有bg.gif图片,在js下面有test.js文件,则可以通过 /resources/images/bg.gif 和 /resources/js/test.js 访问这二个静态资源

    5.1K30

    浅析java构造函数前的访问限定符问题

    曾经一直有个问题困扰着我,我一直以为构造函数前面不能加任何东西,但偶然间看到了一本书上写的代码中,构造函数前加了public限定符,心里很是疑惑,构造函数前加毛访问限定符啊??!  ...class HolidaySked{ BitSet sked; private HolidaySked(){ // 此处将HolidaySked类的构造函数声明为...System.out.println("Error: "+nfe.getMessage()); } } } } 在此 ,我只测试了private限制的构造函数...,事实证明,同一个包中的不同类是无法实例化带有private构造函数的类的, 其他几个限定符protected ,public 和一般函数限定情况是一致的,感兴趣的可自行测试。...也就是说,若一个类的构造函数声明为private,的只有是无法实例化对象的,默认的访问限定符只能包内声明对象(已测试),而public的可以全局声明对象。

    75750

    两个简单例子学会使用Java中的Enum实例1实例2(带构造函数)什么时候使用Enum

    一个enum就像其他的类一样,可以拥有一系列的实例。 下面我们会举几个简单的例子说明如何使用Java中的enum。...Paste_Image.png 实例2(带构造函数) package Enum; public class Test { public static void main(String[] args...我们知道Java中的enum的定义是像其他类一样,只是多了一系列预定义的实例。...一个适合的使用场景是:防止不可用参数,例如下面这个例子: public void doSomethingWithColor(int color); 我们在使用函数的时候发现这个参数是很模糊的,我们不知道不同的颜色对应什么...int值,所以传错参数,但我们如果使用enum,就可以使其变得简单易读: public void doSomethingWithColor(Color color); 根据我们上面定义的enum color

    56120

    IDEA启动的静态web服务不能使用ip访问解决办法

    前言 在开发react native程序时候,使用夜神模拟器中的app调用本地IDEA中启动的html文件,出现一些问题。...问题描述 模拟器中程序无法使用ip访问本地IDEA中启动的html静态文件,并且在IDEA中设置了允许访问依然不行 原因及解决办法 IDEA中启动的html无法被外部访问,即使用IP访问的原因是IDEA...中默认没有开启,为了安全性的考虑,IDEA的服务不允许被外部访问。...新问题: 然后大家会发现,依然不能访问,这是什么原因呢? 原因: 经过多次尝试发现10000以上的端口,都不能使用ip:端口进行访问。...解决方法:所以将默认的63342端口更改成10000以下的端口号即可,如9999,注意不要和系统端口冲突。 至此,html文件已经可以使用ip:端口进行访问了

    3.5K50

    子类A继承父类B, A a = new A(); 则父类B构造函数、父类B静态代码块、父类B非静态代码块、子类A构造函数、子类A静态代码块、子类A非静态代码块 执行的先后顺序是?

    (1)子类A继承父类B, A a = new A(); 则: 父类B静态代码块->子类A静态代码块->父类B非静态代码块->父类B构造函数->子类A非静态代码块->子类A构造函数 (2)若子类构造函数中显式的调用了父类的某构造函数...,但是该类继承自A,所以要先调用父类的构造方法,这里通过super(“B”)显示的调用了父类的带参构造。...执行父类的带参构造前要先对父类中的对象进行初始化,对父类中的c成员进行初始化,调用了C类的无参构造,所以调用顺序为: 先调用C类的无参构造 再调用A类的带参构造 最后调用调用子类的构造 (3...)在JVM调用mian方法之前先用进行静态内容的初始化。...顺序为:父类的静态变量, 父类的静态代码块 ,子类的静态变量,子类的静态代码块。

    2.2K30

    多个类多线程环境下静态构造函数的执行顺序

    网上很多资料说到静态构造函数,但是很少提到与线程相关的,这个例子实际上是想测试一下静态构造函数的多线程冲突。 其实,这个问题源自于XCode v7.3中一个隐秘的BUG。...实体类A的静态构造函数中可能会开一个线程去执行方法B,然后静态构造函数接着执行后续方法C,问题就在于B和C都会争夺同一个锁,如果B拿到这个锁,它会创建一个A的实例,但是因为A的静态构造函数正常执行C,C...TEntity的静态构造函数。...答案: 上面微软的答复邮件说得很清楚,静态构造函数只会被调用一次,并且在它执行完成之前,任何其它线程都不能创建这个类的实例或使用这个类的静态成员!...这里面包含几层一次: 1,静态构造函数只会被调用一次,并且在所有对该类的访问之前。这一点我确信99.99%的人都知道。 2,“其它线程”。

    88270

    类静态初始化块即将纳入ES2022,我们先一睹为快

    为了建立一个类的实例,在JavaScript中有两个结构: 字段:创建(可选择初始化)实例属性。 构造函数:在 setup 完成之前执行的代码块。 对于类的静态部分的设置,我们只有静态字段。...ECMAScript建议为类引入静态初始化块,大致上,它对静态类的作用就像构造函数对实例的作用。 1.为什么我们需要类中的静态块?...initializeTranslator() 不能访问 Translator 的私有数据。 通过提出的静态块(A行),我们有更优雅的解决方案。...3.详情 静态块的具体内容相对来说是合乎逻辑的(相比之下,实例成员的规则更为复杂): 每个类可以有一个以上的静态块。 静态块的执行是与静态字段初始化器的执行交错进行的。...6.总结 类静态块是一个相对简单的功能,它完善了类的静态功能。粗略来说,它是实例构造函数的静态版本。它主要在我们需要设置一个以上的静态字段时有用。

    20420

    挑战一文搞懂带你搞懂单例模式,面试手撕双重检查锁定单例模式不害怕!

    在创建对象的过程中,new Singleton() 不是一个原子操作,实际上可以分为三个步骤: 为对象分配内存。 调用构造函数,初始化对象。 将对象引用赋值给变量。...而除了这种基于手动加锁的形式来实现单例模式之外,我们其实还有其他更好玩的手段: 1.基于静态内部类来构造单例模式 /** * 懒汉式 (静态内部类方式) */ class lazzySingletonInnerClass...我们看一看源码: 点开Enum的源码,其实就可以发现一个知识点:Enum没有无参构造函数。...为什么要和当前类的Modifiers搞&运算?Modifiers又是什么? 在Java中,Modifiers 是一个与反射(Reflection)相关的主题,涉及到类、接口、方法和字段的访问修饰符。...也就是说那段代码的意思是判断当前对象的Modifiers值是不是16384,如果是的话就说明当前类是个枚举类,直接抛出异常,这也是为什么不能对枚举类进行反射的直接原因。

    18110
    领券