我已经了解到,在Java中,静态块在初始化类时执行,并且在构造每个类的实例之前执行实例块.我总是在实例块之前看到要执行的静态块.为什么案件相反enums?
任何人都可以请解释示例代码的输出:
enum CoffeeSize {
BIG(8), LARGE(10),HUGE(12),OVERWHELMING();
private int ounces ;
static {
System.out.println("static block ");
}
{
System.out.println("instance block");
}
private CoffeeSize(int ounces){
this.ounces = ounces;
System.out.println(ounces);
}
private CoffeeSize(){
this.ounces = 20;
System.out.println(ounces);
}
public int getOunces() {
return ounces;
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
实例块
8
实例块
10
实例块
12
实例块
20
静态块
Java如何在内部确保每个JVM只存在一个ENUM实例?它是在应用程序启动时创建的,当多个线程访问它时,它会返回启动时创建的对象吗?
或者它是否实现了类似于单例模式的某种双重同步,这样即使多个线程访问它,也只会创建一个istance?
如何通过ClassLoader或类似机制实例化Enum类型?(我试图将所有内容保存在独立服务器应用程序的相同上下文类加载器下).
我有类似的东西:
ClassLoader loader = new CustomClassLoader(parent, libDir);
Thread.currentThread().setContextClassLoader(loader);
// trouble area
Class<?> containerClass = loader.loadClass("com.somepackage.app.Name$SERVER");
Run Code Online (Sandbox Code Playgroud)
我错误地认为只需加载Enum就足以启动它(它的私有构造函数包含启动方法调用和什么不是).
执行上面的操作不会导致任何异常,但JVM只会在最后一行之后终止,并且服务器无法启动.
显然这样做:
containerClass.newInstance();
Run Code Online (Sandbox Code Playgroud)
抛出异常导致结果.
如果我在枚举类型中有一堆枚举实例,并且如果我第一次访问它的实例,那么它的所有剩余实例也会同时初始化.有没有办法在第一次访问时初始化枚举实例?
以前不是使用枚举,我会做类似的事情:
public static ExampleClass instance;
public ExampleClass(){
instance=this;
}
public static ExampleClass getInstance(){
return instance;
}
Run Code Online (Sandbox Code Playgroud)
然后有人告诉我一个enum单身人士:
public enum Example{
INSTANCE;
public static Example getInstance(){
return Example.INSTANCE;
}
Run Code Online (Sandbox Code Playgroud)
在第一个例子中,我必须实例化对象才能创建实例.有了枚举,我不需要这样做..至少它出现了.有人可以解释这背后的原因吗?
我有一个需要defaultValue编译时常量的注释。我defaultValue从enum下面:
enum class RaceType {
MARATHON,
SPRINT;
companion object {
fun apply(type: RaceType): RaceDto {
return when (type) {
MARATHON -> MarathonDto()
SPRINT -> SprintDto()
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的dtos如下:
interface RaceDto {
}
data class MarathonDto: RaceDto
data class SprintDto: RaceDto
Run Code Online (Sandbox Code Playgroud)
当我使用注释时,@QraphQLArgument(defaultValue = RaceType.SPRINT.name)Kotlin 要求RaceType.SPRINT.name是编译时常量。
注释实现本身:
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.PARAMETER})
public @interface GraphQLArgument {
String NONE = "\n\t\t\n\t\t\n\ue000\ue001\ue002\n\t\t\t\t\n";
String NULL = "\n\t\t\n\t\t\n\ue000\ue001\ue002\ue003\n\t\t\t\t\n";
String name();
String description() default "";
String …Run Code Online (Sandbox Code Playgroud) enums ×5
java ×5
singleton ×2
annotations ×1
classloader ×1
graphql-spqr ×1
instance ×1
kotlin ×1
lazy-loading ×1
static-block ×1