当前位置: 首页 > 面试题库 >

无法定义私有静态最终变量,因为它会引发异常

彭飞虎
2023-03-14
问题内容

我有一个像这样的课程:

public class SomeClassImpl implements SomeClass {
   private static final SomeLib someLib = new SomeLib();
}

我不能这样做,因为SomeLib抛出UnknownHostException。

我知道我可以将实例化到构造函数中,但是我有办法以某种方式使它实例化吗?这样我就可以将var标记为final。

我试图寻找如何在类级别上引发异常,但找不到任何东西。


问题答案:

您可以使用静态初始化程序

public class SomeClassImpl implements SomeClass {
   private static final SomeLib someLib;
   static {
     SomeLib tmp = null;
     try {
       tmp = new SomeLib();
     } catch (UnknownHostException uhe) {
       // Handle exception.
     }
     someLib = tmp;
   }
}

请注意,我们需要使用一个临时变量来避免“变量some​​Lib可能尚未初始化”的错误,并应对someLib由于存在而只能分配一次的事实final

但是,需要向静态初始值设定项添加复杂的初始化逻辑和异常处理通常是更基本的设计问题的标志。您在注释部分中写道,这是一个数据库连接池类。与其使用静态final,不如考虑使其成为实例变量。然后,您可以在构造函数中进行初始化,也可以在静态工厂方法中进行初始化。



 类似资料:
  • 问题内容: 给定下面的Java代码,您可以在Ruby类中最接近地表示这两个变量吗?而且,在Ruby中是否可以像Java中那样区分和变量? 问题答案: Ruby中确实没有等效的构造。 但是,您似乎犯了一个经典的移植错误:您有一种使用语言A 的 解决方案 ,然后尝试将其翻译为语言B,这时您真正应该做的就是找出 问题 ,然后找出解决方法使用语言B。 我不能完全确定您要从那个小的代码段中解决什么问题,但是

  • 问题内容: 请参考下面的代码。运行代码时,我可以更改最终非静态变量的值。但是,如果我尝试更改最终静态变量的值,则会抛出异常。 我的问题是,为什么在非静态最终变量也不会抛出异常,反之亦然。为什么会有所不同? 问题答案: 该解决方案并非没有缺点,它可能无法在所有情况下都有效: 如果在字段声明中将字段初始化为编译时常量,则对该字段的更改可能不可见,因为该最终字段的使用会在编译时用编译时常量替换。 另一个

  • 问题内容: 我已经在Google上进行了广泛的搜索,但均无济于事。我似乎无法将这个概念笼罩在脑海中。为什么本地班级会接受静态最终字段?如下面的以下示例: 在EnglishGoodbye课堂上,允许告别可变吗?为什么?我很困惑。为什么允许但没有静态变量?我知道为什么它不能访问封闭范围的成员,除非它们是一个编译器时间常数,因为当函数结束时这些变量不再存在,但类可能不存在。对?我只是对此感到困惑。 谢谢

  • 问题内容: 将变量声明为的区别是什么 要么 如果我只希望变量是局部的,并且是常量(以后不能更改)? 谢谢 问题答案: 仅仅具有预期的效果。 声明static使其成为一个类变量,使其可以使用类名进行访问

  • 问题内容: 有一条规则说: 代表常量(最终变量)的名称必须全部使用大写字母,并使用下划线分隔单词(摘自http://geosoft.no/development/javastyle.html) 对于基本类型(例如int或字符串)可以很好地工作: 但是非原始类型呢?在大多数情况下,我已经看到以下内容: 或单例,实例变量不是大写的。 问题是声明这些类型的变量(如日志和实例)的正确方法是什么? 问题答案

  • 问题内容: 将私有方法定型是否有好处?这样会提高性能吗? 我认为“私有最终”没有多大意义,因为私有方法不能被覆盖。因此,方法查找应该像使用final时一样高效。 (如果可能)将私有助手方法设为静态会更好吗? 最好使用什么? 问题答案: 添加方法不会提高Sun HotSpot的性能。HotSpot会在可能添加的地方注意到该方法永远不会被覆盖,因此请一视同仁。 在Java中,方法是非虚拟的。您不能覆盖