- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
在上次面试中,我被问到一个关于 java 中所有 Singleton 实现的标准问题。他们有多糟糕。
有人告诉我,由于构造函数中可能出现未经检查的异常,即使是静态初始化也是不好的:
public class Singleton {
private static Singleton instance = new Singleton();
public static Singleton getInstance() {
return instance;
}
private Singleton() {
throw new RuntimeException("Wow... Exception in Singleton constructor...");
}
}
他们还告诉我,异常将是“ClassNotFoundException”,因此很难在实际应用中找到问题。
我试图得到那个异常:
public static void main(String[] args) {
new Thread(new Runnable(){
public void run() {
Singleton.getInstance();
}
}).start();
}
但我得到的唯一信息是 ExceptionInInitializerError...
我在谷歌上搜索了那个异常,在我发现的所有地方——他们都在谈论我在面试中被告知的同一个问题。与“实现”无关 =)
感谢您的关注。
最佳答案
有时你会在面试中遇到奇怪的问题,你应该总是预料到意想不到的事情。 ;)
您使用的任何技术都有优点和缺点。您必须知道什么时候是使用它们的好时机、可能出现的问题以及如何解决它们。
重要的是要记住,几乎每个问题都有解决方案或解决方法。
On my last interview I was asked a standard question about all Singleton implementations in java. And how bad they all are.
听起来不像是一个问题,更像是一场宗教辩论。
And I was told that even the static initialization is bad because of the probability of unchecked exception in constructor:
Siderman IV:蜘蛛侠 vs Singleton 和静态初始化器。 (坏人;)
throw new RuntimeException("Wow... Exception in Singleton constructor...");
这是个坏主意,所以不要那样做。事实上它甚至不会编译。 Java 6 中的编译器报告。
initializer must be able to complete normally
And they also told me that the Exception is gonna be "ClassNotFoundException" so it would be extremely hard to find the problem in real app.
您会收到一个 ExceptionInInitializerError,其中包含导致问题的异常原因。除了必须阅读嵌套的异常之外,它并不那么棘手。
static class Inner {
static {
Integer.parseInt(null);
}
}
public static void main(String... args) {
try {
new Inner();
} catch (Throwable e) {
e.printStackTrace();
}
new Inner();
}
打印
Exception in thread "main" java.lang.ExceptionInInitializerError
at Main.main(Main.java:12)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: java.lang.NumberFormatException: null
at java.lang.Integer.parseInt(Integer.java:417)
at java.lang.Integer.parseInt(Integer.java:499)
at Main$Inner.<clinit>(Main.java:8)
Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class Main$Inner
at Main.main(Main.java:14)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
第一次发生这种情况,之后如果您尝试再次使用该类,您会得到 NoClassDefFoundError。
过去,当您尝试使用反射访问一个类而失败时,您会收到 ClassNotFoundException(没有关于实际发生情况的详细信息),但现在情况已不同。
关于Java:如何在 Singleton 中重现 Legen...dary ClassNotFoundException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7553000/
是否有一个意思是“不是单例”的名字? 最佳答案 CaSTLe Windsor 使用术语“ transient ”来描述所有非单例对象。 不过,我个人更喜欢“非单例”一词。 关于singleton -
我有很多(抽象)工厂,它们通常被实现为单例。 通常是为了方便,不必让他们通过那些真正与使用或了解这些工厂无关的层。 大多数时候我只需要在启动时决定其余代码程序的工厂实现,也许通过一些配置 它看起来例如
我有几个关卡都使用相同的音效。我没有在每个级别都使用相同的代码,而是将所有声音合并到一个单例类中。但是,当我从其他类运行该方法时,将其置于单例中不会播放任何声音。我没有错误或警告。 当我在每个类中使用
我应该使用 EJB-@Singleton (javax.ejb.Singleton) 进行统计或监控,还是将统计信息缓存在公共(public) @SessionScoped-Bean 中会更好?为了澄
我有这个单例类: public class Utente { private static readonly Lazy lazy = new Lazy(() => new Utente
我的 iOS 应用程序对 Web 服务做了很多不同的请求。每个请求都是对 ConnectionManager 对象的方法的调用。当响应从 Web 服务到达时,将调用委托(delegate)的方法来通知
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: cracking singleton with other ways 任何人都可以告诉我 Singleton不能用作
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: cracking singleton with other ways 任何人都可以告诉我 Singleton不能用作
做用 @Singleton 注释的类必须遵循 Singleton design pattern ? 我的猜测是他们没有:没有必要有私有(private)构造函数和 static .instance()
我想提供 Java 中可用的内置单例类列表以及使它们成为单例的原因。 对于 E.G. java.lang.Runtime 原因:因为整个 Java 应用程序只能有一个运行时环境。 java.awt.T
我有一个 Python 3 类,它目前是使用 @singleton 装饰器定义的单例,但有时它需要不是是单例。 问题:是否可以在实例化类的对象时传递一个参数,由该参数决定该类是单例还是非单例? 我正试
我正在使用 get_it 包,你有两个选项来注册单例,懒惰和我猜是“常规”(分别是 GetIt.instance.registerLazySingleton 和 GetIt.instance.regi
单例模式在 Spring 容器级别维护实例,而单例设计模式在类加载器级别维护实例。 还有其他区别吗? 其次,我仍然认为上述理由不成立。事实上,一个应用程序上下文/容器仅加载在一个类加载器中。因此从技术
这个问题在这里已经有了答案: What is an undefined reference/unresolved external symbol error and how do I fix it?
在 Guice 中,有什么区别: // Inside your AbstractModule subclass: @Override public void configure() { bin
我使用 pthread TLS 实现了一种“线程本地单例”,我想知道在这种情况下我如何(以及何时)可以删除 pthread_key_t,因为就像现在一样,TLS key 使用的内存永远不会空闲' d。
如何从 @Singleton 组件返回非单例对象? 例如我有: ApplicationComponent.kt @Singleton @Component(modules = [Application
我正在学习 Dagger 2,我注意到在某些示例中,模块方法中有一个 @Singleton,而组件方法中有其他 @Singleton?模块方法和组件方法上的 @Singleton 批注有什么区别,究竟
我的代码中需要一个单例。我读了 Jon Skeet 的 page在单例上并根据他的推荐选择了这个模型(#4): public sealed class Singleton { private
我正在尝试使用 label2rgb 生成 RGB 标签切片并使用它来更新 RGB 体积,如下所示: labelRGB_slice=label2rgb(handles.label(:,:,han
我是一名优秀的程序员,十分优秀!