在 Enum 中实现 Runnable
Implementing Runnable in Enum
我只是在玩枚举,我想看看它在某些疯狂场景下的表现。好吧,很少 java 书呆子可能知道我们实际上可以在枚举中实现接口。
所以我想出了下面的代码,想知道线程是否被创建和调用。我很好奇是否有人可以解释为什么不打印 sysout。下面的代码是有效的,即可以正常编译并执行。它什么都不打印。谁能解释清楚?
还有为什么没有在枚举 class 或对象 class 中声明 values() 方法。为什么 java 编译器提供了 values 方法。为什么 Sun/Oracle 没有想到在 Enum class 中实现它。
package com.test;
enum MyEnum implements Runnable{
ENUM1,ENUM2,ENUM3;
public void run() {
System.out.println("Inside MyEnum"+Thread.currentThread().getName());
}
}
public class EnumTesting {
MyEnum en;
public static void main(String[] args) {
EnumTesting test = new EnumTesting();
Thread t = new Thread(test.en);
t.start();
}
}
1) 因为 test.en
是空的,所以你永远不会初始化它。
2) 实现values()必须由编译器完成,因为数组类型是具体Enum的类型,这里MyEnum[]
。如果它在 Enum class 中声明,它需要有一个 return 类型的 Enum[]
。
It just prints nothing. Can anyone explain clearly?
请注意,您没有给 en
一个值。因此,它是null
。当null
传递给Thread
的构造函数时,线程documented什么都不做:
Parameters:
target
- the object whose run method is invoked when this thread is started. If null, this classes run
method does nothing.
您可以这样做:
new Thread(MyEnum.ENUM1).start();
Why the Sun/Oracle din't think of implementing it in Enum class.
我的推测是values
,如果在Enum<T>
,应该是abstract
,但是静态方法不能是抽象的。
我只是在玩枚举,我想看看它在某些疯狂场景下的表现。好吧,很少 java 书呆子可能知道我们实际上可以在枚举中实现接口。 所以我想出了下面的代码,想知道线程是否被创建和调用。我很好奇是否有人可以解释为什么不打印 sysout。下面的代码是有效的,即可以正常编译并执行。它什么都不打印。谁能解释清楚?
还有为什么没有在枚举 class 或对象 class 中声明 values() 方法。为什么 java 编译器提供了 values 方法。为什么 Sun/Oracle 没有想到在 Enum class 中实现它。
package com.test;
enum MyEnum implements Runnable{
ENUM1,ENUM2,ENUM3;
public void run() {
System.out.println("Inside MyEnum"+Thread.currentThread().getName());
}
}
public class EnumTesting {
MyEnum en;
public static void main(String[] args) {
EnumTesting test = new EnumTesting();
Thread t = new Thread(test.en);
t.start();
}
}
1) 因为 test.en
是空的,所以你永远不会初始化它。
2) 实现values()必须由编译器完成,因为数组类型是具体Enum的类型,这里MyEnum[]
。如果它在 Enum class 中声明,它需要有一个 return 类型的 Enum[]
。
It just prints nothing. Can anyone explain clearly?
请注意,您没有给 en
一个值。因此,它是null
。当null
传递给Thread
的构造函数时,线程documented什么都不做:
Parameters:
target
- the object whose run method is invoked when this thread is started. If null, this classesrun
method does nothing.
您可以这样做:
new Thread(MyEnum.ENUM1).start();
Why the Sun/Oracle din't think of implementing it in Enum class.
我的推测是values
,如果在Enum<T>
,应该是abstract
,但是静态方法不能是抽象的。