首页 >Java >java教程 >Item 谨慎使用延迟初始化

Item 谨慎使用延迟初始化

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-09 14:03:42306浏览

Item  Utilize a inicialização preguiçosa com parcimônia

什么是延迟初始化?

  • 定义:推迟字段的初始化,直到第一次访问该字段。
  • 优点:如果从未使用过该字段,则可以避免不必要的初始化。
  • 应用程序:用于静态和实例字段。

最佳实践和示例

  1. 正常启动(首选) 简单又有效。

示例:

private final FieldType field = computeFieldValue();

除非另有要求,否则大多数字段都使用正常初始化。

  1. 使用同步 Getter 进行延迟初始化 何时使用:解决启动循环。

示例:

private FieldType field;

synchronized FieldType getField() {
    if (field == null) {
        field = computeFieldValue();
    }
    return field;
}

3。运营商级练习(静态场)

  • 何时使用:静态字段的高效延迟初始化。

示例:

private static class FieldHolder {
    static final FieldType field = computeFieldValue();
}

static FieldType getField() {
    return FieldHolder.field;
}

优点:仅在访问字段时初始化类,初始化后成本最小。

4。双重检查练习(对于实例字段)

  • 何时使用:用于实例字段延迟初始化的性能。

示例:

private volatile FieldType field;

FieldType getField() {
    FieldType result = field;
    if (result == null) { // Primeira verificação (sem bloqueio)
        synchronized (this) {
            result = field;
            if (result == null) { // Segunda verificação (com bloqueio)
                field = result = computeFieldValue();
            }
        }
    }
    return result;
}

5。单次检查练习(允许重复初始化)

  • 何时使用:可以容忍重复初始化的字段。

示例

private volatile FieldType field;

FieldType getField() {
    if (field == null) { // Verificação única
        field = computeFieldValue();
    }
    return field;
}

6。大胆的单一检查练习

  • 何时使用:仅当您容忍额外的初始化并且字段类型是除 long 或 double 以外的原始类型时。

示例:

private FieldType field;

FieldType getField() {
    if (field == null) { // Sem volatile
        field = computeFieldValue();
    }
    return field;
}

一般注意事项

权衡:

  • 延迟初始化可最大限度地降低初始成本,但会增加字段访问成本。
  • 通过性能测量进行评估。

多线程同步:

  • 对于避免严重错误至关重要。
  • 使用安全实践(例如易失性、锁)。

首选用途:

  • 静态场:运营商级练习。
  • 实例字段:仔细检查。
  • 允许重复启动:单次检查。

最终总结

  • 尽可能正常启动。
  • 仅在性能需要或解决循环问题时才使用延迟初始化

以上是Item 谨慎使用延迟初始化的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn