如何在java中初始化类的常量对象字段

2024-03-02

我想知道为类初始化复杂对象类型的常量字段的最佳方法是什么,哪个具有最高的性能?

1) 内联初始化

public class TopClass {
   private static final ComplexObject sdf = new ComplexObject();
            
   public TopClass (
   }
}

2) 初始化方法

public class TopClass {
     private static final ComplexObject sdf = initializeComplexObject();
     private static ComplexObject initializeComplexObject(){
                return sdf == null ? new ComplexObject() : sdf;
     }
     public TopClass (
     }
}

3)构造函数中的初始化, 4) 静态初始化块 或者你建议什么其他方法......

每次创建新的 TopClass 类时 sdf 是否都会初始化? 我希望 sdf 字段在应用程序生命周期中只初始化一次。


静态初始化器的性能几乎无关紧要(特别是对于这种琐碎的初始化),因为它只为一个类完成一次。

2)这个具体的方法做法是多余的,因为它是在类初始化时立即调用的;sdf is alwaysnull 当静态初始化程序调用该方法时,并且您不会再次调用该方法(至少不是为了给出sdf不同的值)。它也很糟糕,因为你故意读取未初始化的最终字段。

因此,只需删除条件,您最终会有效地返回到内联初始化程序方法,并间接调用方法。

例如,如果您想在格式化程序上进行其他配置(例如设置时区),则该方法会很有用。

3) 不要在构造函数中初始化静态成员。构造函数用于初始化实例成员。

特别是,这要求您将静态字段设置为非最终字段。这意味着您必须担心字段更新的可见性,以避免多个线程初始化字段,因为它们看到空值

4) 在声明时初始化字段只是声明静态初始化器的简写。问题中的第一个代码块在语义上与此相同:

private static final ComplexObject sdf;

static {
  sdf = new ComplexObject(); 
}

如果你可以不这么做的话,明确地这样做并没有什么好处。

静态初始化器有点像匿名方法。 Google 的内部 Java 实践建议尽可能使用方法而不是显式静态初始化块,部分原因是您可以显式调用它们进行测试,但也因为它们必然会强制您仅初始化一个字段。 (我基本上同意这是一个很好的建议,但请注意,您会丢失方法中的明确赋值检查 - 正如上面所演示的 - 这可以帮助捕获某些类型的错误)。

结论:使用private static final ComplexObject sdf = new ComplexObject();,因为你不需要任何更复杂的东西。


这里更大的问题是正确性,即确保sdf不在线程之间共享:在编辑问题之前,sdf was a SimpleDateFormat,这不是线程安全的。我不知道什么ComplexObject是,但您需要确保它是线程安全的,或者以线程安全的方式访问它。在进行微优化之前先担心类似的事情。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在java中初始化类的常量对象字段 的相关文章

  • Grizzly 和 Servlet 容器上下文

    我试图在我编写的 在 Grizzly 上运行的 Servlet 中获取一些注入的上下文 例如 Session 或 HttpServletRequest 但我所做的似乎都不起作用 整个过程似乎过早地停止了 并出现以下错误 SEVERE Mis
  • CopyOnWriteArraySet.add 和 remove 的重写等于

    我有像下面这样的课程 class A Override public boolean equals Object other return true Class B extends A Class C extends A Override
  • 光学标记阅读器的开源库[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想要一个用于光学标记读取 OMR 的开源库 有这样的库吗 我想在我的 java 应用程序中使用这个库 zxing 可能对你有用 http
  • 无法让远程 EJB 与 Wildfly 上的 EJB 客户端 API 配合使用

    我目前正在努力让远程 EJB 调用在 wildfly 8 x 和 9 x 上工作 详细来说 它是关于使用 EJB 客户端 API 方法从独立客户端应用程序 而不是从另一个应用程序服务器 进行远程调用 远程命名方法适用于我 但不适用于我的场景
  • 如何在 Java 中根据 XSD 1.1 验证 XML?

    在 Java 中根据 XML Schema 1 1 验证 XML 文件的最佳方法是什么 我从中获取了代码tutorial http www ibm com developerworks xml library x javaxmlvalida
  • 为什么Java HashMap的最大容量是1<<30而不是1<<31?

    Why is the maximum capacity of a Java HashMap 1 lt lt 30 and not 1 lt lt 31 even though the max value of an int is 231 1
  • JPA 为每个项目选择最新实例

    假设我有一个会议实体 每次会议都有一个与会者和一个会议日期 在我的会议表中 我可能为每个与会者举行多个会议 每个会议都有不同的日期 我需要一个 JPA 查询 该查询将为所有与会者仅选择最新的会议 例如 如果我的桌子看起来像这样 Meetin
  • 如何使用 JAVA 和 ADB 命令检查 Appium 中键盘是否打开

    我正在尝试检查 Android 默认键盘是否打开 我没有找到任何可以在 Appium 中使用 JAVA 和 ADB 命令检查键盘的内容 我发现这个 ADB 命令可以检查键盘是否打开 adb shell dumpsys input metho
  • Log4j 未使用属性文件找到自定义附加程序

    我正在尝试使用以下 XML 属性文件在 Eclipse 插件项目中配置 log4j 其中包括一个名为 EclipseLoggingAppender 的自定义附加程序
  • 为什么这不会导致 NullPointerException?

    public class Null public static void greet System out println Hello world public static void main String args Null null
  • JavaPreparedStatementUTF-8字符问题

    我有一份准备好的声明 PreparedStatement st 在我的代码中 我尝试使用 st setString 方法 st setString 1 userName userName 的值为 ak a setString 方法将 ak
  • Tomcat JDBC 池中没有足够的空闲连接

    给定以下 Tomcat JDBC 连接设置
  • MAC OS 的 java.awt.Robot 类中出现无头环境错误

    我正在尝试使用 JavaFX 应用程序捕获屏幕截图Robot class 这是我在我的应用程序中使用的代码 Rectangle screenBounds new Rectangle Screen getPrimary getBounds g
  • 如何加快 jar 签名者的速度?

    我使用 ant 来签署我的 jars 以进行网络启动部署 Ant signjar 在 Web 启动签名时非常慢 如何加快签名过程 我找到了一种可能的解决方案 早些时候 在构建脚本 ant signjar 中 按顺序调用所有 jar 我们使用
  • Java中通过FTP创建文件夹层次结构

    Java 是否有现成的功能可以在远程 FTP 服务器上创建文件夹层次结构 Apache Commons 确实提供了 FTP 客户端 但我找不到创建目录层次结构的方法 它确实允许创建单个目录 makeDirectory 但创建整个路径似乎并不
  • Ubuntu 的打包 - Web 应用程序

    Web 应用程序没有与 C 或类似文件不同的 make 文件 但是 它需要放置在特定的目录中 例如 var www 我是 Linux 打包新手 所以我的问题是 如何将我的应用程序打包到 deb 中 以便在安装时将其放入 etc myprog
  • 使用java读取Excel工作表的单列

    我有一张 Excel 表格 我想编写一个方法 该方法将参数作为要读取的列号 并返回一个由该列中的所有数据组成的数组 然后将该列元素放置在 xml 工作表中 我怎样才能编写一个方法来做到这一点 使用 Apache POI 您可以在他们的使用页
  • 在Java程序中计算zip文件的md5哈希值

    我有一个 zip 文件 在我的 Java 代码中我想计算 zip 文件的 md5 哈希值 有没有我可以用于此目的的 java 库 一些例子将非常感激 谢谢 几周前我通过这篇文章做到了这一点 http www javalobby org ja
  • JTable中动态加载大量数据

    这是我的问题 我目前有一个 JTable 其中包含 5 000 到超过 200 000 行 你知道我要说什么了 数据已经加载到内存中了 这不是问题 但是如何 我可以创建一个高效的 JTable 以便它只加载以下行 是可见的 并且任何事件仅作
  • 从 AJP 连接器请求中检索 Shibboleth 属性

    当我在 Apache 上运行 Shibboleth 身份验证时遇到了一个奇怪的问题 当 Tomcat7 在后端运行时 Apache 通过 mod proxy ajp 发送所有内容 Shibboleth 的参数也是如此 In the 文档 h

随机推荐

  • 如何知道文字的方向?

    在 UITextView 中输入时 我需要根据键盘的语言了解文本的方向 例如 如果用户输入英语 则方向将为 从左到右 如果用户输入阿拉伯语 则方向将为 从右到左 我毫无疑问地需要这个值 并避免对每种语言及其文本方向之间的匹配进行硬编码 这可
  • LESSCHARSET=utf-8 less 似乎不起作用

    我正在尝试查看 UTF 8 文本文件 流less 即使我像这样调用它 cat file LESSCHARSET utf 8 less 非 ASCII 兼容的 UTF 8 字符无法正确显示 相反 它们的十六进制值在括号中突出显示 例如
  • Java 构建路径 - 添加外部 JAR 并添加变量

    Java 构建路径 添加外部 JAR 按钮和添加变量按钮功能之间有什么区别 为什么需要它 请详细解释一下 两者都可以用来实现相同的目标 将 JAR 添加到构建路径中 假设您有一个项目 P1 想要使用供应商 S1 安装的 JAR 该 JAR
  • Java 8 过滤器映射 >

    如何过滤一个Map
  • iPhone 上的 CoreMotion 碰撞与震动

    我正在尝试检测用户何时将 iPhone 撞到另一个物体上 以及何时只是摇晃手机 我似乎无法让它按照我想要的方式完美工作 因为它要么记录太多颠簸 要么没有颠簸 或者认为摇晃就是颠簸 有人可以看看我下面的代码并提供建议吗 我需要确保其中之一发生
  • 当由 router-outlet 创建组件时,如何为组件设置输入绑定?

    当路由器创建组件时 如何设置属性绑定 不支持对路由器添加的组件使用绑定 另请参阅此讨论https github com angular angular issues 4452 https github com angular angular
  • TypeORM:PostgreSQL 中自动生成的 UUID

    我正在编写一个 REST API 对于数据访问 我正在使用 typeorm 我已经成功使用了它 但我希望在我的一个表上有一个 UUID 自动生成的主键 有谁知道如何在 typeorm 中设置 UUID 类型并自动生成的列 我尝试了以下操作
  • 安卓。内存不足问题

    我需要在我的应用程序中显示许多图像 这些是 jpg 和 png 我将它们加载到 ImageView 中 如下所示 tile setImageResource R drawable tile highlight 我目前遇到内存不足问题 jav
  • 追加后访问元素

    我需要在 JQuery 追加后访问 DOM 元素 假设我有这个 ul li class item one li li class item two li ul 然后是 JavaScript var addItems function htm
  • 当 .CSV 的值之一可能在字符串中包含逗号时处理 .CSV

    我有一个 csv 需要将其转换为 Coldfusion 查询 我使用了 cflib org CSVtoQuery 方法 效果很好 但是 如果 csv 中有一个 单元格 在字符串中包含逗号 例如列表 则该记录的查询行会变得混乱 因为它将字符串
  • 使用 Intersection Observer API 延迟翻译元素

    我在用着路口观察器 API https developer mozilla org en US docs Web API Intersection Observer API当用户滚动到内容时显示元素 效果很好 但我想要延迟显示 div 如果
  • Swagger - 授权对带有文档的 url 的请求

    我想知道 Swagger 中是否有一个选项可以授权对包含外部文档的 url 的请求 我有以下配置 我感兴趣的是urls 1 part springdoc swagger ui urls 0 url v3 api docs springdoc
  • 将 PIL 图像保存为 json 的最佳方法是什么

    我正在尝试发送应包含 Pillow 图像作为其字段之一的 json 字典 为此我必须将图像转换为字符串 我尝试使用枕头功能 image toString 但仍然以字节的形式得到它 所以我尝试对其进行编码 buff BytesIO image
  • 将 matplotlib 图像发送到 pymsteams(无法创建新标签 pymsteams)

    我正在使用 matplotlib 来绘制我的图像 import pandas as pd from matplotlib import pyplot as plt x 09 30 09 33 09 40 09 43 09 50 09 53
  • C 中令人困惑的指针

    我有不止一个疑问 所以请耐心等待 有人能告诉我为什么这段代码失败吗 include
  • 如何检测桌面版 Chrome 用户代理和移动版 Chrome 用户代理?

    对于 Chrome 桌面扩展程序主页 我尝试检测用户是否在 Android 上使用桌面版 Chrome 或移动版 Chrome 目前 下面的脚本将 Android Chrome 识别为与桌面 Chrome 相同 在桌面 Chrome 上 它
  • 如何重新初始化highlight.js?

    我的网站正在动态生成一些内容 因此我必须以某种方式启动高亮 js http softwaremaniacs org soft highlight en 加载后再次插件 此代码用于启动荧光笔 hljs initHighlightingOnLo
  • 如何使用 Kubernetes Python 客户端连接 Google Kubernetes 引擎

    我正在使用 Kubernetes Python 客户端来管理我的本地 Kubernetes 集群 from kubernetes import client config config client Configuration config
  • 使用 Keras 和 TensorFlow 查找可最大化神经网络输出的输入

    我使用 Keras 和 TensorFlow 对时尚 MNIST https github com zalandoresearch fashion mnist下列的本教程 https www tensorflow org tutorials
  • 如何在java中初始化类的常量对象字段

    我想知道为类初始化复杂对象类型的常量字段的最佳方法是什么 哪个具有最高的性能 1 内联初始化 public class TopClass private static final ComplexObject sdf new ComplexO