【问题标题】:Alternative to static blocks without unused variable替代没有未使用变量的静态块
【发布时间】:2018-10-08 04:57:50
【问题描述】:

作为alternative to static blocks,Oracle 文档建议调用方法,并且示例使用变量赋值:

public static varType myVar = initializeClassVariable();

私有静态方法的优点是,如果您需要重新初始化类变量,它们可以在以后重用。

但是如果我不需要(并且希望避免未使用的)额外变量并且在我的静态块中还返回语句,那么调用静态代码的更好方法是什么?

在构造函数中调用静态方法对于静态块执行一次静态代码(构造函数可以是 private 用于实用程序类)是错误的设计

public MyClass() {
     MyClass.initializeClassVariable();
}

那么唯一的改进是减少对私有的变量访问级别吗?

 private static varType myVar = initializeClassVariable();

或者更好的方法是保留静态块并在那里添加方法?

static {
    initializeClassVariable();
}

【问题讨论】:

  • “我不需要(并且希望避免未使用的)额外变量”是什么意思?您在说什么额外变量?静态代码的重点不就是初始化一个静态字段,即该字段有两种方式吗?
  • @Andreas 我不需要myVar,它只是为执行静态代码而定义的
  • 那么,如果不初始化静态字段,静态代码会做什么? “替代静态块”是关于初始化静态字段的替代方式。
  • 如果你使用一个静态块,你不会通过那里再次调用该方法。您可以一次性运行该方法中的代码。
  • 如果静态块不是在初始化一个静态字段,或者是同时初始化多个静态字段的复杂逻辑,那么“替代”是不合适的。文档只是提到一个替代方案,而不是它总是适用的,或者你必须使用它。

标签: java static-block unused-variables


【解决方案1】:

“静态块的替代方案”是关于初始化单个静态字段。

例子:

class A {
    static Map<String, Integer> romans;
    static {
        romans = new HashMap<>();
        romans.put("I", 1);
        romans.put("V", 5);
        romans.put("X", 10);
    }
}

替代方案:

class A {
    static Map<String, Integer> romans = initRomans();

    private static Map<String, Integer> initRomans() {
        Map<String, Integer> r = new HashMap<>();
        r.put("I", 1);
        r.put("V", 5);
        r.put("X", 10);
        return r;
    }
}

正如文章所说,使用此代码您可以重置静态字段。

    public static void resetRomans() {
        romans = initRomans();
    }

如果您的代码执行其他操作,则“替代方案”不适用,并且您将代码编写在静态初始化程序块中。

class A {
    static {
        Manager.register(A.class);
    }
}

【讨论】:

猜你喜欢
  • 2016-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-19
  • 1970-01-01
  • 2018-03-06
  • 2019-10-23
  • 1970-01-01
相关资源
最近更新 更多