java中enmu类的ordinal字段记录了各个枚举变量的索引值,
FsAction类中的各个变量的利用了上述的索引值的定义,即二进制位:
000,001,010,011,100,101,110,111,即FsAction中各个枚举值的顺序是不能乱动的。
因此FsAction中的implies方法能够用按位与的方法得以实现。
package org.apache.hadoop.fs.permission;
/**
* File system actions, e.g. read, write, etc.
*/
public enum FsAction {
// POSIX style
NONE("---"),
EXECUTE("--x"),
WRITE("-w-"),
WRITE_EXECUTE("-wx"),
READ("r--"),
READ_EXECUTE("r-x"),
READ_WRITE("rw-"),
ALL("rwx");
/** Retain reference to value array. */
private final static FsAction[] vals = values();
/** Symbolic representation */
public final String SYMBOL;
private FsAction(String s) {
SYMBOL = s;
}
/**
* Return true if this action implies that action.
* @param that
*/
public boolean implies(FsAction that) {
if (that != null) {
return (ordinal() & that.ordinal()) == that.ordinal();
}
return false;
}
/** AND operation. */
public FsAction and(FsAction that) {
return vals[ordinal() & that.ordinal()];
}
/** OR operation. */
public FsAction or(FsAction that) {
return vals[ordinal() | that.ordinal()];
}
/** NOT operation. */
public FsAction not() {
return vals[7 - ordinal()];
}
public static void main(String[] args) {
FsAction all = FsAction.ALL;
System.out.println(all);
System.out.println(all.ordinal());
}
}