「java枚举类以逗号结尾」java枚举类以逗号结尾吗
今天给各位分享java枚举类以逗号结尾的知识,其中也会对java枚举类以逗号结尾吗进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
- 1、C问题:书上说“枚举类型定义时最后一个枚举元素后不加任何符号”。
- 2、求教这逗号结尾代码什么意思?
- 3、Java枚举中的方法调用问题
- 4、enum在java中是什么意思
- 5、在java中如何将emun枚举类型作为参数传入函数中?
- 6、java如何取到最后一个逗号后面的字符
C问题:书上说“枚举类型定义时最后一个枚举元素后不加任何符号”。
其实这个应该没有什么影响,不仅是枚举有这个问题,而且 数组等等也有这个问题。
应该是编译器对此没有限定。
如果你使用sql语句创建表的话,就会发现不能使用了。因为编译器会报错
求教这逗号结尾代码什么意思?
感觉像是c的代码
#if ACC
BOXANGLE,
BOXHORIZON,
#endif
#if BARO (!defined(SUPPRESS_BARO_ALTHOLD))
BOXBARO,
#endif
上面几行表示条件编译,ACC如果定义了的话就包含下面2句语句
,分隔符 是因为在枚举类型里面,都是枚举的一个值,用 ,隔开的
Java枚举中的方法调用问题
定义一个简单的枚举代码
public enum WorkDay{ Monday,Tuesday,Wednesday,Thurday,Friday;//定义时,枚举值间有逗号隔开,最后用分号结束 }
废话不多说,直接上main 方法,拿去玩玩吧:
Java代码
public static void main(String []args) { /** * 枚举类型是一种类型,既然是类型,就是跟int,char他们 一样的, * 拿来定义变量,限制你对变量的赋值,就像 int a,你不能够给a一个 string的值 * 同理,一个枚举用来定义一个变量时,你只能够赋枚举值,其方式为 * "枚举名.值" */ WorkDay myworkday=WorkDay.Wednesday; /** 补充点switch的基础知识,switch语句括号中支持byte \short \char \int类型, * jdk 1.5以后支持枚举,所以,这里可以直接使用枚举变量myworkday。 * 呵呵,在jdk1.7后将switch将支持string */ switch (myworkday) { /*枚举重写了toString()方法,所以枚举变量的值不带前缀 * myworkday 里面的值应该是枚举括号里面的那几个 */ case Monday: System.out.println("you work day is Monday !"); break; case Tuesday: System.out.println("you work day is Tuesday!"); break; case Wednesday: System.out.println("you work day is Wednesday !"); break; case Thurday: System.out.println("you work day is Thurday !"); break; case Friday: System.out.println("you work day is Friday !"); break; } System.out.println("--------遍历所有值----------"); //----使用values()方法返回一个数组 for(WorkDay day:WorkDay.values()) { System.out.println(day); } //-----既然是数组,就可以统计大小 System.out.println("WorkDay 里面有 "+WorkDay.values().length+" 个元素"); //--------------------调用 ordinal()方法,返回枚举值在枚举中的索引,数组索引嘛,当然从0开始 System.out.println(WorkDay.Monday.ordinal()); System.out.println(WorkDay.Friday.ordinal()); //---默认实现java.lang.Comparable接口 ,测试测试 System.out.println(WorkDay.Monday.compareTo(WorkDay.Thurday));//结果应该是 -3 //---Monday的索引为0,Thurday为 3,0-3=-3, System.out.println(WorkDay.Friday.compareTo(WorkDay.Tuesday));//同理,结果应该为4-1=3, }
简单吧,来点狠的,前面说了,枚举有点像类,只是把class换成了enum,那么它跟一般的类一样可以添加属性或方法。
带方法与属性的enum代码
public enum WeAreJavaer{ chinese,java, spring, DB2, AIX; // 枚举列表,必须写在最前面,否则编译出错 private final static String location = "javaeye"; //定义一个属性 public static WeAreJavaer getInfomation() { WeAreJavaer flag=null; if (location.equals("javaeye")) { flag=java; } else { flag= chinese; } return flag; } }
老规矩,直接上main()方法测试:
写道
public static void main(String []ags) { System.out.println("---------------------测试调用枚举中写的方法-------------------------------"); System.out.println("直接调用枚举里面的方法: "+ WeAreJavaer.getInfomation()); }
3、来点更狠的。
你可以通过括号来给enum赋值,这样的话,你必须有带参的构造方法,还需要有一属性与方法,否则编译时会出错。
另外,你如果给enum里面的元素赋值的话,要么都赋,要么都不赋,不要东赋一个,西赋一个。
如果不赋值则不能写构造方法,如果你赋值了,而没有构造方法,编译还是通不过,废话不多少,来,看:
可赋值的enum代码
public enum People { xiaowang(20), xiaozhang(32),xiaoli(50), xiaogou(21); private final int age; People(int value) { //构造器只能是默认或者private, 从而保证构造函数只能在内部使用 this.age = value; } public int getAge() { return age; } }
好吧,啥也不说了,接下来的事,你懂地:
测试带值enum代码
public static void main(String[] args) {
for(People people:People.values()){
/*通过getValue()取得相关枚举的值*/
System.out.println(people+" 的年龄 :"+people.getAge());
}
}
enum在java中是什么意思
Enum 类型的介绍
枚举类型(Enumerated Type) 很早就出现在编程语言中,它被用来将一组类似的值包含到一种类型当中。而这种枚举类型的名称则会被定义成独一无二的类型描述符,在这一点上和常量的定义相似。不过相比较常量类型,枚举类型可以为申明的变量提供更大的取值范围。
举个例子来说明一下,如果希望为彩虹描绘出七种颜色,你可以在 Java 程序中通过常量定义方式来实现。
清单 1. 常量定义
Public static class RainbowColor {
// 红橙黄绿青蓝紫七种颜色的常量定义
public static final int RED = 0;
public static final int ORANGE = 1;
public static final int YELLOW = 2;
public static final int GREEN = 3;
public static final int CYAN = 4;
public static final int BLUE = 5;
public static final int PURPLE = 6;
}
使用的时候,你可以在程序中直接引用这些常量。但是,这种方式还是存在着一些问题。
类型不安全
由于颜色常量的对应值是整数形,所以程序执行过程中很有可能给颜色变量传入一个任意的整数值,导致出现错误。
没有命名空间
由于颜色常量只是类的属性,当你使用的时候不得不通过类来访问。
一致性差
因为整形枚举属于编译期常量,所以编译过程完成后,所有客户端和服务器端引用的地方,会直接将整数值写入。这样,当你修改旧的枚举整数值后或者增加新的枚举值后,所有引用地方代码都需要重新编译,否则运行时刻就会出现错误。
类型无指意性
由于颜色枚举值仅仅是一些无任何含义的整数值,如果在运行期调试时候,你就会发现日志中有很多魔术数字,但除了程序员本身,其他人很难明白其奥秘。
如何定义 Enum 类型
为了改进 Java 语言在这方面的不足弥补缺陷,5.0 版本 SDK 发布时候,在语言层面上增加了枚举类型。枚举类型的定义也非常的简单,用 enum 关键字加上名称和大括号包含起来的枚举值体即可,例如上面提到的彩虹颜色就可以用新的 enum 方式来重新定义:
enum RainbowColor { RED, ORANGE, YELLOW, GREEN, CYAN, BLUE, PURPLE }
从上面的定义形式来看,似乎 Java 中的枚举类型很简单,但实际上 Java 语言规范赋予枚举类型的功能非常的强大,它不仅是简单地将整形数值转换成对象,而是将枚举类型定义转变成一个完整功能的类定义。这种类型定义的扩展允许开发者给枚举类型增加任何方法和属性,也可以实现任意的接口。另外,Java 平台也为 Enum 类型提供了高质量的实现,比如默认实现 Comparable 和 Serializable 接口,让开发者一般情况下不用关心这些细节。
回到本文的主题上来,引入枚举类型到底能够给我们开发带来什么样好处呢?一个最直接的益处就是扩大 switch 语句使用范围。5.0 之前,Java 中 switch 的值只能够是简单类型,比如 int、byte、short、char, 有了枚举类型之后,就可以使用对象了。这样一来,程序的控制选择就变得更加的方便,看下面的例子:
清单 2. 定义 Enum 类型
// 定义一周七天的枚举类型
public enum WeekDayEnum { Mon, Tue, Wed, Thu, Fri, Sat, Sun }
// 读取当天的信息
WeekDayEnum today = readToday();
// 根据日期来选择进行活动
switch(today) {
Mon: do something; break;
Tue: do something; break;
Wed: do something; break;
Thu: do something; break;
Fri: do something; break;
Sat: play sports game; break;
Sun: have a rest; break;
}
对于这些枚举的日期,JVM 都会在运行期构造成出一个简单的对象实例一一对应。这些对象都有唯一的 identity,类似整形数值一样,switch 语句就根据此来进行执行跳转。
如何定制 Enum 类型
除了以上这种最常见的枚举定义形式外,如果需要给枚举类型增加一些复杂功能,也可以通过类似 class 的定义来给枚举进行定制。比如要给 enum 类型增加属性,可以像下面这样定义:
清单 3. 定制枚举类型
// 定义 RSS(Really Simple Syndication) 种子的枚举类型
public enum NewsRSSFeedEnum {
// 雅虎头条新闻 RSS 种子
YAHOO_TOP_STORIES(""),
//CBS 头条新闻 RSS 种子
CBS_TOP_STORIES(""),
// 洛杉矶时报头条新闻 RSS 种子
LATIMES_TOP_STORIES("");
// 枚举对象的 RSS 地址的属性
private String rss_url;
// 枚举对象构造函数
private NewsRSSFeedEnum(String rss) {
this.rss_url = rss;
}
// 枚举对象获取 RSS 地址的方法
public String getRssURL() {
return this.rss_url;
}
}
上面头条新闻的枚举类型增加了一个 RSS 地址的属性 , 记录头条新闻的访问地址。同时,需要外部传入 RSS 访问地址的值,因而需要定义一个构造函数来初始化此属性。另外,还需要向外提供方法来读取 RSS 地址。
如何避免错误使用 Enum
不过在使用 Enum 时候有几个地方需要注意:
enum 类型不支持 public 和 protected 修饰符的构造方法,因此构造函数一定要是 private 或 friendly 的。也正因为如此,所以枚举对象是无法在程序中通过直接调用其构造方法来初始化的。
定义 enum 类型时候,如果是简单类型,那么最后一个枚举值后不用跟任何一个符号;但如果有定制方法,那么最后一个枚举值与后面代码要用分号';'隔开,不能用逗号或空格。
由于 enum 类型的值实际上是通过运行期构造出对象来表示的,所以在 cluster 环境下,每个虚拟机都会构造出一个同义的枚举对象。因而在做比较操作时候就需要注意,如果直接通过使用等号 ( ‘ == ’ ) 操作符,这些看似一样的枚举值一定不相等,因为这不是同一个对象实例。
看下面的这个例子:
清单 4. 避免错误使用 Enum 示例
// 定义一个一周七天的枚举类型
package example.enumeration.codes;
public enum WeekDayEnum {
Mon(1), Tue(2), Wed(3), Thu(4), Fri(5), Sat(6), Sun(7);
private int index;
WeekDayEnum(int idx) {
this.index = idx;
}
public int getIndex() {
return index;
}
}
// 客户端程序,将一个枚举值通过网络传递给服务器端
package example.enumeration.codes;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;
public class EnumerationClient {
public static void main(String... args) throws UnknownHostException, IOException {
Socket socket = new Socket();
// 建立到服务器端的连接
socket.connect(new InetSocketAddress("127.0.0.1", 8999));
// 从连接中得到输出流
OutputStream os = socket.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(os);
// 将星期五这个枚举值传递给服务器端
oos.writeObject(WeekDayEnum.Fri);
oos.close();
os.close();
socket.close();
}
}
// 服务器端程序,将从客户端收到的枚举值应用到逻辑处理中
package example.enumeration.codes;
import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
public class EnumerationServer {
public static void main(String... args) throws IOException, ClassNotFoundException {
ServerSocket server = new ServerSocket(8999);
// 建立服务器端的网络连接侦听
Socket socket = server.accept();
// 从连接中获取输入流
InputStream is = socket.getInputStream();
ObjectInputStream ois = new ObjectInputStream(is);
// 读出客户端传递来的枚举值
WeekDayEnum day = (WeekDayEnum) ois.readObject();
// 用值比较方式来对比枚举对象
if (day == WeekDayEnum.Fri) {
System.out.println("client Friday enum value is same as server's");
} else if (day.equals(WeekDayEnum.Fri)) {
System.out.println("client Friday enum value is equal to server's");
} else {
System.out.println("client Friday enum value is not same as server's");
}
// 用 switch 方式来比较枚举对象
switch (day) {
case Mon:
System.out.println("Do Monday work");
break;
case Tue:
System.out.println("Do Tuesday work");
break;
case Wed:
System.out.println("Do Wednesday work");
break;
case Thu:
System.out.println("Do Thursday work");
break;
case Fri:
System.out.println("Do Friday work");
break;
case Sat:
System.out.println("Do Saturday work");
break;
case Sun:
System.out.println("Do Sunday work");
break;
default:
System.out.println("I don't know which is day");
break;
}
ois.close();
is.close();
socket.close();
}
}
打印结果如下:
client Friday enum value is same as server's
Do Friday work
通过程序执行结果,我们能够发现在分布式条件下客户端和服务端的虚拟机上都生成了一个枚举对象,即使看起来一样的 Fri 枚举值,如果使用等号‘ == ’进行比较的话会出现不等的情况。而 switch 语句则是通过 equal 方法来比较枚举对象的值,因此当你的枚举对象较复杂时候,你就需要小心 override 与比较相关的方法,防止出现值比较方面的错误。
Enum 相关工具类
JDK5.0 中在增加 Enum 类的同时,也增加了两个工具类 EnumSet 和 EnumMap,这两个类都放在 java.util 包中。EnumSet 是一个针对枚举类型的高性能的 Set 接口实现。EnumSet 中装入的所有枚举对象都必须是同一种类型,在其内部,是通过 bit-vector 来实现,也就是通过一个 long 型数。EnumSet 支持在枚举类型的所有值的某个范围中进行迭代。回到上面日期枚举的例子上:
enum WeekDayEnum { Mon, Tue, Wed, Thu, Fri, Sat, Sun }
你能够在每周七天日期中进行迭代,EnumSet 类提供一个静态方法 range 让迭代很容易完成:
for(WeekDayEnum day : EnumSet.range(WeekDayEnum.Mon, WeekDayEnum.Fri)) {
System.out.println(day);
}
打印结果如下:
Mon
Tue
Wed
Thu
Fri
EnumSet 还提供了很多个类型安全的获取子集的 of 方法,使你很容易取得子集:
EnumSetWeekDayEnum subset = EnumSet.of(WeekDayEnum.Mon, WeekDayEnum.Wed);
for (WeekDayEnum day : subset) {
System.out.println(day);
}
打印结果如下:
Mon
Wed
与 EnumSet 类似,EnumMap 也是一个高性能的 Map 接口实现,用来管理使用枚举类型作为 keys 的映射表,内部是通过数组方式来实现。EnumMap 将丰富的和安全的 Map 接口与数组快速访问结合到一起,如果你希望要将一个枚举类型映射到一个值,你应该使用 EnumMap。看下面的例子:
清单 5. EnumMap 示例
// 定义一个 EnumMap 对象,映射表主键是日期枚举类型,值是颜色枚举类型
private static MapWeekDayEnum, RainbowColor schema =
new EnumMapWeekDayEnum, RainbowColor(WeekDayEnum.class);
static{
// 将一周的每一天与彩虹的某一种色彩映射起来
for (int i = 0; i WeekDayEnum.values().length; i++) {
schema.put(WeekDayEnum.values()[i], RainbowColor.values()[i]);
}
}
System.out.println("What is the lucky color today?");
System.out.println("It's " + schema.get(WeekDayEnum.Sat));
当你询问周六的幸运色彩时候,会得到蓝色:
清单 6. 运行结果
What is the lucky color today?
It's BLUE
结束语
Enum 类型提出给 JAVA 编程带了了极大的便利,让程序的控制更加的容易,也不容易出现错误。所以在遇到需要控制程序流程时候,可以多想想是否可以利用 enum 来实现。
在java中如何将emun枚举类型作为参数传入函数中?
简单点说,c:forEach标签的作用就是迭代输出标签内部的内容。它既可以进行固定次数的迭代输出,也可以依据集合中对象的个数来决定迭代的次数。
c:forEach标签的语法定义如下所示。
c:forEach var="name" items="expression" varStatus="name"
begin="expression" end="expression" step="expression"
body content
/c:forEach
c:forEach
标签具有以下一些属性:
l var:迭代参数的名称。在迭代体中可以使用的变量的名称,用来表示每一个迭代变量。类型为String。
l items:要进行迭代的集合。对于它所支持的类型将在下面进行讲解。
l varStatus:迭代变量的名称,用来表示迭代的状态,可以访问到迭代自身的信息。
l begin:如果指定了items,那么迭代就从items[begin]开始进行迭代;如果没有指定items,那么就从begin开始迭代。它的类型为整数。
l end:如果指定了items,那么就在items
java枚举类以逗号结尾的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java枚举类以逗号结尾吗、java枚举类以逗号结尾的信息别忘了在本站进行查找喔。
结束迭代;如果没有指定items,那么就在end结束迭代。它的类型也为整数。l step:迭代的步长。
c:forEach标签的items属性支持Java平台所提供的所有标准集合类型。此外,您可以使用该操作来迭代数组(包括基本类型数组)中的元素。它所支持的集合类型以及迭代的元素如下所示:
l java.util.Collection:调用iterator()来获得的元素。
l java.util.Map:通过java.util.Map.Entry所获得的实例。
l java.util.Iterator:迭代器元素。
l java.util.Enumeration:枚举元素。
l Object实例数组:数组元素。
l 基本类型值数组:经过包装的数组元素。
l 用逗号定界的String:分割后的子字符串。
l javax.servlet.jsp.jstl.sql.Result:SQL查询所获得的行。
不论是对整数还是对集合进行迭代,c:forEach的varStatus属性所起的作用相同。和var属性一样,varStatus用于创建限定了作用域的变量(改变量只在当前标签体内起作用)。不过,由varStatus属性命名的变量并不存储当前索引值或当前元素,而是赋予javax.servlet.jsp.jstl.core.LoopTagStatus类的实例。该类包含了一系列的特性,它们描述了迭代的当前状态,如下这些属性的含义如下所示:
l current:当前这次迭代的(集合中的)项。
l index:当前这次迭代从0开始的迭代索引。
l count:当前这次迭代从1开始的迭代计数。
l first:用来表明当前这轮迭代是否为第一次迭代,该属性为boolean类型。
l last:用来表明当前这轮迭代是否为最后一次迭代,该属性为boolean类型。
l begin:begin属性的值。
l end:end属性的值
l step:step属性的值
下面就来看个基本的例子,第一个例子是依次输出集合内的元素。
c:forEach var="item" items="${contents}" varStatus="status"
$status.count:${item}
/c:forEach
java如何取到最后一个逗号后面的字符
String test="abc,efg,hij";
int one = test.lastIndexOf(",");
System.out.println(test.substring((one+1),test.length()));
//这样就可以了,只会打印 hij 最后一个逗号前的都不打印 亲测,你试试呵呵
java枚举类以逗号结尾的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java枚举类以逗号结尾吗、java枚举类以逗号结尾的信息别忘了在本站进行查找喔。
发布于:2022-11-22,除非注明,否则均为
原创文章,转载请注明出处。