java.util.concurrent.TimeUnit类设计模式

时间:2014-01-16 13:50:13

标签: java oop interface enumeration

我正在使用班级java.util.concurrent.TimeUnit,我发现了一些有趣的约定,我不知道,我不明白是关于枚举我自己做了一个例子我希望有人可以向我解释..

带方法的简单接口。

interface MyInterface{public String concate(String... a);}

后者我创建了一个enumeration

public enum Enumerations implements MyInterface
{
   STRINGUTILITIES{},
   BEANENUMERATION{},   
   NANOSECONDS 
   {//sample methods
   public long toNanos(long d)   { return d; }
   public long toMicros(long d)  { return d; }
   public long toMillis(long d)  { return d; }
   public long toSeconds(long d) { return d; }
   public long toMinutes(long d) { return d; }
   public long toHours(long d)   { return d; }
   public long toDays(long d)    { return d;}
   public long convert(long d) { return d;}
   int excessNanos(long d, long m){return 13;}      
};  
@Override public String concate(String... a){throw new  AbstractMethodError();}                           

}

我需要为我实施concate方法确定

我的第一个问题是。

STRINGUTILITIES{},
BEANENUMERATION{},   
NANOSECONDS{}

是枚举?我认为实际上是嵌套的枚举..

我主要担心的是外部枚举comment上的Enumerations 连接方法

STRINGUTILITIES{},
BEANENUMERATION{},   
NANOSECONDS{}

抱怨他们没有实现这个方法..似乎3个内部枚举在某种程度上扩展了外部枚举,如果外部枚举正在实现该方法,那么就可以了。

像这样

public enum Enumerations implements MyInterface
{
   STRINGUTILITIES{},
   BeanEnumeration{},   
   NANOSECONDS 
   {
    public long toNanos(long d)   { return d; }
    public long toMicros(long d)  { return d; }
    public long toMillis(long d)  { return d; }
    public long toSeconds(long d) { return d; }
    public long toMinutes(long d) { return d; }
    public long toHours(long d)   { return d; }
    public long toDays(long d)    { return d;}
    public long convert(long d) { return d;}
    int excessNanos(long d, long m){return 13;}
    };   
}

如果外部枚举没有实现该方法,并且我在每个嵌套枚举上实现该方法是OK

其他问题,如果comment这样的嵌套枚举

interface MyInterface{public String concate(String... a);}
public enum Enumerations implements MyInterface
{   
    @Override public String concate(String... a){return "java";}                           
}

显示错误..

请有人通过解释如何使用这种方法并命名..

非常感谢..

1 个答案:

答案 0 :(得分:2)

声明时,任何对象都可以拥有非静态初始化块:

Object a = new Object() {
    public long toNanos(long d) {
        return d;
    }
};

枚举也不例外。

块中的方法必须覆盖/实现引用类型(上面的Object)的类/接口中的方法才能被调用。请注意,TimeUnit初始化块中的所有方法都会覆盖TimeUnit本身的方法。