精华内容
下载资源
问答
  • } } My doubt is, if it is not about constructors then what makes enum in Java non instantiable? 解决方案 ... An enum type has no instances other than those defined by its enum constants. It is a ...

    I know that an enum

    enum Year

    {

    First, Second, Third, Fourth;

    }

    gets converted into

    final class Year extends Enum

    {

    public static final Year First = new Year();

    public static final Year Second = new Year();

    public static final Year Third = new Year();

    public static final Year Fourth = new Year();

    }

    When I tried to instantiate enum (not class) I got compile time error as:

    error: enum types may not be instantiated

    Year y = new Year();

    As per my knowledge a private constructor makes a class non instantiable. And I thought that compiler is providing a private constructor. But again I got confused when saw we can define a constructor for enum with default modifier and still cannot create an object of type enum.

    enum Year

    {

    First, Second, Third, Fourth;

    Year()

    {

    }

    }

    class Example

    {

    public static void main(String[] args)

    {

    Year y = new Year();

    }

    }

    My doubt is, if it is not about constructors then what makes enum in Java non instantiable?

    解决方案

    ...

    An enum type has no instances other than those defined by its enum constants. It is a compile-time error to attempt to explicitly instantiate an enum type (§15.9.1).

    Hence the compiler ensures that this requirement is met. Since the compiler "knows" that the type is an enum, it can distinguish between enum Year and final class Year.

    Also, no access modifier is allowed for an enum constructor:

    ...

    It is a compile-time error if a constructor declaration in an enum declaration is public or protected.

    ...

    In an enum declaration, a constructor declaration with no access modifiers is private.

    So, in practice, an enum constructor looks like package-scoped (no access modifier), but it really is private.

    Finally, the same section also states

    In an enum declaration with no constructor declarations, a default constructor is implicitly declared. The default constructor is private, has no formal parameters, and has no throws clause.

    This makes the enum non-instantiable even if no constructor is explicitly declared.

    展开全文
  • Java 枚举 通过数字实例化枚举类型

    千次阅读 2018-06-30 17:36:00
    要注意这里构造函数不能为public或者protected, 从而保证构造函数只能在内部使用,客户代码不能new一个枚举值的实例出来。这也是完全符合情理的,因为我们知道枚举值是public static final的常量而已。 5.实现...
    package com.zjl.domain.enumtype;
    
    /**
     * 枚举类
     *
     * @Author zjl
     * @Date 2018/06/27
     */
    public enum EnumType {
    
        All_TYPE("所有类型", 0),
        TYPE_ONE("类型一", 1), 
        TYPE_TOW("类型二", 2), 
       
    
        private final String typeName;
        private final int typeVal;
    
        EnumType (String typeName, int typeVal) {
            this.typeName = typeName;
            this.typeVal = typeVal;
        }
    
        /**
         * 通过 typeVal 的数值获取枚举实例
         *
         * @param val
         * @return
         */
        public static EnumType getEnumType (int val) {
            for (EnumType type : EnumType .values()) {
                if (type.getTypeVal() == val) {
                    return type;
                }
            }
            return null;
        }
    
        public String getTypeName() {
            return typeName;
        }
    
        public int getTypeVal() {
            return typeVal;
        }
    
    
    }
    

     

    java枚举类Enum方法简介(valueof,value,ordinal)

    Enum作为Sun全新引进的一个关键字,看起来很象是特殊的class,   它也可以有自己的变量,可以定义自己的方法,可以实现一个或者多个接口。   当我们在声明一个enum类型时,我们应该注意到enum类型有如下的一些特征。   

      1.它不能有public的构造函数,这样做可以保证客户代码没有办法新建一个enum的实例。   

      2.所有枚举值都是public   ,   static   ,   final的。注意这一点只是针对于枚举值,我们可以和在普通类里面定义   变量一样定义其它任何类型的非枚举变量,这些变量可以用任何你想用的修饰符。   

      3.Enum默认实现了java.lang.Comparable接口。   

      4.Enum覆载了了toString方法,因此我们如果调用Color.Blue.toString()默认返回字符串”Blue”.   

       5.Enum提供了一个valueOf方法,这个方法和toString方法是相对应的。调用valueOf(“Blue”)将返回 Color.Blue.因此我们在自己重写toString方法的时候就要注意到这一点,一把来说应该相对应地重写valueOf方法。   

      6.Enum还提供了values方法,这个方法使你能够方便的遍历所有的枚举值。   

      7.Enum还有一个oridinal的方法,这个方法返回枚举值在枚举类种的顺序,这个顺序根据枚举值声明的顺序而定,这里Color.Red.ordinal()返回0。   

      了解了这些基本特性,我们来看看如何使用它们。   

      1.遍历所有有枚举值.   知道了有values方法,我们可以轻车熟路地用ForEach循环来遍历了枚举值了。   

      for   (Color   c:   Color.values())   
      System.out.println(“find   value:”   +   c);   

      2.在enum中定义方法和变量,比如我们可以为Color增加一个方法随机返回一个颜色。   

      public   enum   Color   {   
      Red,   
      Green,   
      Blue;   

      /*   
      *定义一个变量表示枚举值的数目。   
      *(我有点奇怪为什么sun没有给enum直接提供一个size方法).   
      */   
      private   static   int   number   =   Color.values().length   ;   

      /**   
      *   随机返回一个枚举值   
      @return   a   random   enum   value.   
      */   
      public   static   Color   getRandomColor(){   
      long   random   =   System.currentTimeMillis()   %   number;   
      switch   ((int)   random){   
       case   0:   
        return   Color.Red;   
       case   1:   
        return   Color.Green;   
       case   2:   
        return   Color.Blue;   
       default   :   return   Color.Red;   
      }   
      }   
      }   

      可以看出这在枚举类型里定义变量和方法和在普通类里面定义方法和变量没有什么区别。唯一要注意的只是变量和方法定义必须放在所有枚举值定义的后面,否则编译器会给出一个错误。   

      3.覆载(Override)toString,   valueOf方法   

      前面我们已经知道enum提供了toString,valueOf等方法,很多时候我们都需要覆载默认的toString方法,那么对于enum我们怎么做呢。其实这和覆载一个普通class的toString方法没有什么区别。   

      ….   
      public   String   toString(){   
      switch   (this){   
      case   Red:   
       return   "Color.Red ";   
      case   Green:   
       return   "Color.Green ";   
      case   Blue:   
       return   "Color.Blue ";   
      default:   
       return   "Unknow   Color ";   
      }   
      }   
      ….   

      这时我们可以看到,此时再用前面的遍历代码打印出来的是   

      Color.Red   
      Color.Green   
      Color.Blue   

      而不是   

      Red   
      Green   
      Blue.   

      可以看到toString确实是被覆载了。一般来说在覆载toString的时候我们同时也应该覆载valueOf方法,以保持它们相互的一致性。   

      4.使用构造函数   

      虽然enum不可以有public的构造函数,但是我们还是可以定义private的构造函数,在enum内部使用。还是用Color这个例子。   

      public   enum   Color   {   
      Red( "This   is   Red "),   
      Green( "This   is   Green "),   
      Blue( "This   is   Blue ");   

      private   String   desc;   

      Color(String   desc){   
      this.desc   =   desc;   
      }   

      public   String   getDesc(){   
      return   this.desc;   
      }   

      }   

      这里我们为每一个颜色提供了一个说明信息,   然后定义了一个构造函数接受这个说明信息。   

      要注意这里构造函数不能为public或者protected,   从而保证构造函数只能在内部使用,客户代码不能new一个枚举值的实例出来。这也是完全符合情理的,因为我们知道枚举值是public   static   final的常量而已。   

      5.实现特定的接口   

      我们已经知道enum可以定义变量和方法,它要实现一个接口也和普通class实现一个接口一样,这里就不作示例了。   

      6.定义枚举值自己的方法。   

      前面我们看到可以为enum定义一些方法,其实我们甚至可以为每一个枚举值定义方法。这样,我们前面覆载   toString的例子可以被改写成这样。   

      public   enum   Color   {   
      Red   {   
      public   String   toString(){   
       return   "Color.Red ";   
      }   
      },   
      Green   {   
      public   String   toString(){   
       return   "Color.Green ";   
      }   
      },   
      Blue{   
      public   String   toString(){   
       return   "Color.Blue ";   
      }   
      };   
      }   

      从逻辑上来说这样比原先提供一个“全局“的toString方法要清晰一些。   

      总的来说,enum作为一个全新定义的类型,是希望能够帮助程序员写出的代码更加简单易懂,个人觉得一般也不需要过多的使用enum的一些高级特性,否则就和简单易懂的初衷想违背了。 

     

     

    转载于:https://my.oschina.net/zjllovecode/blog/1838228

    展开全文
  • java5引入了枚举类这一新特性,

    java5引入了枚举类这一新特性,最近开发用到了,主要是用来解决将大量判断if-else语句转换为switch-case语句,这样程序从执行效率和可读性都会得到很大提升。

    关于枚举类,网上的资料都没怎么提到,如何根据一个动态的输入值,来得到该枚举类的实例,这里参考了一篇文章《java switch的使用+switch用String作为条件》


    public enum Bank {
    		 ICBC("95588"),YNRCC("96500"), BOC("95566"), BOCM("95599"), UNKNOWN("");
    //		ICBC, YNRCC, BOC, BOCM;
    
    		 private String bank;
    		
    		 private Bank(String str) {
    		 this.bank = str;
    		 }
    		 private String getBank() {
    		 return this.bank;
    		 }
    		
    		 private void setBank(String b) {
    		 this.bank = b;
    		 }
    		
    		 //覆盖enum.toString()方法
    		 public String toString() {
    		 return bank;
    		 }
    		 
    		 /**
    		  * 
    		  * @功能 : TODO 将输入值变成枚举常量值,注意该方法需要再外部调用,应定义为static
    		  * @param str
    		  * @return
    		  */
    		 public static Bank getBank(String str) {
    			 System.out.println("str="+str);
    			 try {
    				 System.out.println("valueOf(str)="+valueOf(str));
    				 return valueOf(str);
    			 }catch (Exception e) {
    				 System.out.println("....");
    				 return UNKNOWN;
    			 }
    		 }
    
    	}
    

    下面开始测试这个枚举类

    //实例化枚举类
    	public static void testIfSwitch1(String input) {
    		 
    		Bank bankList = Bank.getBank(input);
    		 System.out.println("bankList="+bankList+",bankList.hashCode="+bankList.hashCode());
    		 
    		 switch(bankList) {
    		 case YNRCC:
    		 {
    		 System.out.println("YNRCC bankList="+bankList);
    		 //自定义业务逻辑
    		 };
    		 break;
    		 case ICBC:
    		 {
    		 System.out.println("ICBC bankList="+bankList);
    		 //自定义业务逻辑
    		 };
    		 break;
    		 case BOC: {
    		 System.out.println("BOC bankList="+bankList);
    		 //自定义业务逻辑
    		 };
    		 break;
    		 case BOCM: {
    		 System.out.println("BOCM bankList="+bankList);
    		 //自定义业务逻辑
    		 };
    		 break;
    		 default: System.out.println("defalut bankList="+bankList);break;
    		 }
    	}


    调用

    testIfSwitch1("BOC");
    执行结果:

    str=BOC
    valueOf(str)=95566
    bankList=95566,bankList.hashCode=7699183
    BOC bankList=95566

    展开全文
  • 所以保证了枚举不会被反射实例化 另外,序列化一个枚举类的对象,获取的时候调用的是继承的Enum的valueOf 方法T result = enumType.enumConstantDirectory().get(name);根据name去找存入的对象,所以不会生成多个...

    虽然是private的构造函数,但是Constructor的newInstance方法

    所以保证了枚举不会被反射实例化

     

    另外,序列化一个枚举类的对象,获取的时候调用的是继承的Enum的valueOf 方法T result = enumType.enumConstantDirectory().get(name);根据name去找存入的对象,所以不会生成多个对象。

    但是枚举类实现单例,缺点在于属性写起来麻烦,方法不容易添加,序列化保存的文件不好升级

    转载于:https://www.cnblogs.com/chuliang/p/8037873.html

    展开全文
  • Java 枚举(enum) 详解7种常见的用法

    万次阅读 多人点赞 2016-08-11 11:14:45
    JDK1.5引入了新的类型——枚举。在Java中它虽然算个“小”功能,却给我的开发带来了“大”方便。 大师兄我【大师兄】又加上自己的理解,来帮助各位理解一下。 用法一:常量 在JDK1.5之前,我们定义常量都是:...
  • Java枚举枚举进阶

    万次阅读 2020-12-16 11:13:52
    上一节我们讲了[枚举初识]里面主要讲了枚举的实现原理,我们从编译器的角度看了枚举的底层实现以及枚举常用的方法 今天我们看一下枚举添加自定义方法和构造函数,枚举的抽象和接口,枚举与switch 和基于枚举的单例,...
  • Java -- 枚举

    2018-11-23 11:54:52
    温馨提示 :所有自定义的枚举类都默认继承 java.lang.Enum 类,本节内容结合 java.lang.Enum 类进行讲解,切勿混淆 ** 1、定义一个枚举类 2、枚举类不可以产生实例对象,因为自定义的枚举,都默认继承 ...
  • Java 枚举 @author:Jingdai @date:2020.09.06 概念 枚举是特殊的常量类,构造方法默认强制为私有。(必须) 枚举类型是 Enum 类的子类。 Enum 类重写了 toString() 方法,返回枚举类中包含的该枚举常量的名称。 ...
  • 深入理解Java枚举类型(enum)

    万次阅读 多人点赞 2017-05-13 18:27:14
    【版权申明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) ... 出自【zejian的博客】 关联文章: 深入理解Java类型信息...深入理解Java枚举类型(enum) 深入理解Java注解类型(@Annotation) 深入理解
  • //手机 请上下左右 滑动屏幕 观看更全! //package Main; //枚举 ... * @SaySomething(我觉得我应该说点什么的): ... * :Java在1.5后才提出例如枚举的概念,在实际的开发任务当中枚举的主要作用是用于定义 * ...
  • 枚举类也是可以多个实例化

    千次阅读 2019-05-05 20:24:43
    枚举类是Java5新添加的一种类型,其本质也是一个类,既然是类,怎么不会让实例化,不然本身的那几个实例怎么得来的 枚举类并非坚不可摧,我们可以通过下面的代码,绕过构造方法newInstance时,对枚举类的检查,注意...
  • java继承之枚举类型

    千次阅读 2018-04-25 12:14:09
    实例化方法:枚举类名 变量名=枚举类名.列表中某一元素。例如:public enum Size {SMALL,MEDIUM,LARGE,EXTRA_LARGE};其实,这个声明定义的类型是一个类,它刚好有4个实例,在比较两个枚举对象的值时,可以使用"...
  • Java中的枚举

    2017-06-13 18:08:21
    虽然知道在Java中存在枚举类型,但是却一直很少用。最近接触了一些,特加以总结。 枚举类型的定义枚举类型是指由一组固定的常量组成合法值的类型。比如我们常用的: public static final static ERROR = -1; ...
  • Java_enum枚举

    千次阅读 2013-05-15 08:14:18
    本博文为子墨原创,转载请注明出处!... 构造器只能私有private,不允许public修饰,枚举类的方法和数据域可供外部访问。枚举enum只有一个值时,就成了单例。 2.enum常用方法  1).ordinal()  
  • Java 接口与枚举

    2019-07-14 14:03:16
    一、Java中的接口 1、接口 多个抽象类的抽象就是接口。用 interface 来声明接口。 在Java中最小的程序单元是类,接口其实是一个特殊的类.,编译之后,和类一样具有一份字节码 Java中接口表示规范,用于定义一组...
  • Java 深入理解枚举

    千次阅读 2019-06-22 18:44:09
    什么是枚举 我们平时定义常量,是这么定义的 public class Days { public static final int MONDAY =1; public static final int TUESDAY=2; public static final int WEDNESDAY=3; public static final int...
  • Java基础_枚举类型

    2019-01-28 12:54:49
    Java面试_枚举类型一、Java 5 之前定义"枚举类型"二、Java 5之后的枚举类型三、 java.lang.Enum类原码分析三、switch-case 与 枚举1. switch-case2. switch-case与枚举四、 枚举练习1.枚举中的方法2.枚举...
  • Java枚举详解

    万次阅读 多人点赞 2019-05-12 23:07:44
    枚举是一个被命名的整型常数的集合,用于声明一组带标识符的常数。枚举在曰常生活中很常见,例如一个人的性别只能是“男...而使用 Java 枚举类型 enum 可以更贴近地表示这种常量。 声明枚举 声明枚举时必须使用 enu...
  • 单例模式比较常见的实现方法有懒汉模式、饿汉模式、DCL(双重检验锁)模式和公有静态成员等,不过自从Java 1.5版本起,单元素枚举实现单例模式成为最佳的方法。 Java中的枚举 枚举的用法比较多,本文主要介绍利用...
  • JavaJAVA枚举类型

    2015-08-31 21:54:12
    JDK 5新增了enum关键字可用于定义一个枚举类。... private TestClass(){}//定义私有构造函数,不能从外部实例化对象  //提供两个实例A、B  public static final TestClass A=new TestCla
  • Java学习-枚举

    2017-03-05 22:52:47
    枚举,感觉搞的有点混乱,不太好理解...//在Java中,枚举其实也是一个类 //所有的枚举类型,都是Enum的子类,只是不需要显示extends,就好比所有的类都是Object的子类一样 public enum Size { //类中都是类的实例 // S
  • Java枚举

    多人点赞 2019-04-25 20:02:53
    java枚举java引用数据类型中的一种,从JDK1.5开始才引入了枚举,为什么会出现枚举呢?正因为会经 常涉及到相关的操作,所以在开发中把这样具有鲜明特征的功能单独的抽象出来使用。那么具体是什么样特点呢? 即这个...
  • java 中的枚举

    2016-11-27 10:51:04
    1.枚举类继承了java.util.Enum 直接父类,但是他的根本还是Object类 2.枚举类的构造器只能使用pravite访问控制符 3.枚举类的所有实例必须在枚举类中显示出来,否则该枚举类永远不能产生实例。列出这些实例,系统会...
  • java 枚举类型的基本想法非常简单:这些类通过共有的静态final域为每个枚举常量导出一个实例枚举类型没有可以访问的构造器,所以它是真的final类。客户端不能创建枚举类型的实例,也不能对它进行扩展,因此不存...
  • 《effective java》里面已经承认单元素枚举类是实现单例模式...单元素枚举类型更加简洁、无偿的提供了序列化机制,绝对防止多次实例化,即使是在面对复杂的序列化或者反射攻击时;它已经成为实现Singleton的最佳方法。
  • java学习之枚举

    2011-02-15 20:12:00
    public enum WeekDay { SUN(1),MON,TUE,WED,THI,FRI,SAT; private WeekDay() { ... System.out.println("first");...枚举对象相当于类的实例化对象,枚举里可以定义构造函数,并且可以根据枚举对象的参数来
  • 枚举类型是Java 1.5中新增特性的一部分,它是一种特殊的数据类型,之所以特殊是因为它既是一种类(class)类型却又比类类型多了些特殊的约束,但是这些约束的存在也造就了枚举类型的简洁性、安全性以及便捷性,同时...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 89,630
精华内容 35,852
关键字:

java实例化枚举

java 订阅