标签:size vat 不同 factory 类型 dal public 耦合 exce
Vector是ArrayList的多线程版本,HashTable是HashMap的多线程版本。
对于变动的集合排序
import java.util.ArrayList;
import java.util.SortedSet;
import java.util.TreeSet;
public class Client69 {
public static void main(String[] args) {
SortedSet<Person> set = new TreeSet<Person>();
// 身高180CM
set.add(new Person(180));
// 身高175CM
set.add(new Person(175));
set.first().setHeight(185);
set=new TreeSet<Person>(new ArrayList<Person>(set));
for (Person p : set) {
System.out.println("身高:" + p.getHeight());
}
}
static class Person implements Comparable<Person> {
// 身高
private int height;
public Person(int _height) {
height = _height;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
// 按照身高排序
@Override
public int compareTo(Person o) {
return height - o.height;
}
}
}
enum Season {
Spring, Summer, Autumn, Winter;
public static Season getComfortableSeason(){
return Spring;
}
}
enum Role {
Admin("管理员", new LifeTime(), new Scope()), User("普通用户", new LifeTime(), new Scope());
private String name;
private LifeTime lifeTime;
private Scope scope;
/* setter和getter方法略 */
Role(String _name, LifeTime _lifeTime, Scope _scope) {
name = _name;
lifeTime = _lifeTime;
scope = _scope;
}
}
class LifeTime {
}
class Scope {
}
name:表示的是该角色的中文名称
lifeTime:表示的是该角色的生命周期,也就是多长时间该角色失效
scope:表示的该角色的权限范围
枚举.valueOf(name)
没有匹配找到指定值报错:
Exception in thread "main" java.lang.IllegalArgumentException: No enum ...
at java.lang.Enum.valueOf(Unknown Source)
两种避免的方式:
(1)、使用try......catch捕捉异常
try{
枚举.valueOf(name)
}catch(Exception e){
e.printStackTrace();
System.out.println("无相关枚举项");
}
(2)、扩展枚举类
enum Season {
Spring, Summer, Autumn, Winter;
// 是否包含指定的枚举项
public static boolean isContains(String name) {
// 所有的枚举值
Season[] season = values();
for (Season s : season) {
if (s.name().equals(name)) {
return true;
}
}
return false;
}
}
枚举非静态方法实现工厂方法模式
enum CarFactory {
// 定义生产类能生产汽车的类型
FordCar, BuickCar;
// 生产汽车
public Car create() {
switch (this) {
case FordCar:
return new FordCar();
case BuickCar:
return new BuickCar();
default:
throw new AssertionError("无效参数");
}
}
}
通过抽象方法生成产品
enum CarFactory {
// 定义生产类能生产汽车的类型
FordCar{
public Car create(){
return new FordCar();
}
},
BuickCar{
public Car create(){
return new BuickCar();
}
};
//抽象生产方法
public abstract Car create();
}
使用枚举类型的工厂方法模式三个优点:
为了更好地使用枚举,Java提供了两个枚举集合:EnumSet和EnumMap,这两个集合使用的方法都比较简单,EnumSet表示其元素必须是某一枚举的枚举项,EnumMap表示Key值必须是某一枚举的枚举项,由于枚举类型的实例数量固定并且有限,相对来说EnumSet和EnumMap的效率会比其它Set和Map要高。
当枚举项数量小于等于64时,创建一个RegularEnumSet实例对象,大于64时则创建一个JumboEnumSet实例对象。
枚举项数量不要超过64,否则建议拆分。
import java.util.EnumSet;
public class EnumSetTest {
//普通枚举项,数量等于64
enum Const{
A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,
AA,BB,CC,DD,EE,FF,GG,HH,II,JJ,KK,LL,MM,NN,OO,PP,QQ,RR,SS,TT,UU,VV,WW,XX,YY,ZZ,
AAA,BBB,CCC,DDD,EEE,FFF,GGG,HHH,III,JJJ,KKK,LLL
}
//大枚举,数量超过64
enum LargeConst{
A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,
AA,BB,CC,DD,EE,FF,GG,HH,II,JJ,KK,LL,MM,NN,OO,PP,QQ,RR,SS,TT,UU,VV,WW,XX,YY,ZZ,
AAAA,BBBB,CCCC,DDDD,EEEE,FFFF,GGGG,HHHH,IIII,JJJJ,KKKK,LLLL,MMMM
}
public static void main(String[] args) {
EnumSet<Const> cs = EnumSet.allOf(Const.class);
EnumSet<LargeConst> lcs = EnumSet.allOf(LargeConst.class);
//打印出枚举数量
System.out.println("Const的枚举数量:"+cs.size());
System.out.println("LargeConst的枚举数量:"+lcs.size());
//输出两个EnumSet的class
System.out.println(cs.getClass());
System.out.println(lcs.getClass());
}
}
allOf调用noneOf
public static <E extends Enum<E>> EnumSet<E> allOf(Class<E> elementType) {
//生成一个空EnumSet
EnumSet<E> result = noneOf(elementType);
//加入所有的枚举项
result.addAll();
return result;
}
public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
//获得所有的枚举项
Enum[] universe = getUniverse(elementType);
if (universe == null)
throw new ClassCastException(elementType + " not an enum");
//枚举数量小于等于64
if (universe.length <= 64)
return new RegularEnumSet<>(elementType, universe);
else
//枚举数量大于64
return new JumboEnumSet<>(elementType, universe);
}
interface Foo {
public void doSomething();
}
class FooImpl implements Foo{
@Override
public void doSomething() {
}
}
这段代码在Java1.6版本上编译没问题,虽然doSomething方法只是实现了接口的定义,严格来说并不是覆写,但@Override出现在这里可减少代码中出现的错误。
可如果在Java1.5版本上编译此段代码可能会出现错误:The method doSomeThing() of type FooImpl must override a superclass method。
Java1.5版本的@Override是严格遵守覆写的定义:子类方法与父类方法必须具有相同的方法名、输出参数、输出参数(允许子类缩小)、访问权限(允许子类扩大),父类必须是一个类,不能是接口,否则不能算是覆写。而这在Java1.6就开放了很多,实现接口的方法也可以加上@Override注解了,可以避免粗心大意导致方法名称与接口不一致的情况发生。
Java1.6版本的程序移植到1.5版本环境中,就需要删除实现接口方法上的@Override注解。
编写高质量代码:改善Java程序的151个建议 --[78~92]
标签:size vat 不同 factory 类型 dal public 耦合 exce
原文地址:https://www.cnblogs.com/androidsuperman/p/9456403.html