【发布时间】:2019-05-28 04:40:52
【问题描述】:
我在一次采访中被问到这个问题。
有一个类,我们称之为A。它有一个默认构造函数,并在其构造函数中初始化了 2 个不同的连接。
方法initDB & initSocket 创建一个数据库连接和一个套接字连接并将它们保存在实例字段中。 他们只是一个例子。它们也可以是文件打开或其他任何东西。
假设客户端实例化了此类的一个实例。现在initDB 执行成功,但initSocket 抛出异常。所以对象创建被中止。但是数据库连接在异常之前没有关闭。这导致了资源泄漏。我将如何处理这种资源泄漏?
例如
class A {
public A(){
this.dbConnection = initDB();
this.socketConnection = initSocket(); // throws exception
}
}
我最初的回答是我不会在构造函数中初始化它们,而是在单独的init() 中初始化。他反驳说这可能是一个遗留类,我被要求保持这一点。在这种情况下,我需要以某种方式清除资源泄漏。我将如何解决这个问题?
我被难住了,因为实例创建引发了异常,我丢失了对这些连接字段的任何引用。所以我不能给他们打电话close()。但它们仍然会出现在操作系统级别(这是我的猜测)。
注 1
正如面试官所说,我无法更改已经编写好的构造函数的行为。我可以扩展或围绕它做一些事情,但不能更改代码。
注 2
我认为面试官并没有明确寻找任何可以处理这种情况的代码。任何 JMX 的东西会有帮助吗?我对此嗤之以鼻,然后我们继续前进。对于那些认为这是一个很好的问题的人,我认为面试官知道这不是一般做法,可能无法回答。
【问题讨论】:
-
如果它抛出,你可以抓住它并在
catch内处理它 -
@VaughanHilts,不。我确实明确要求过,但他直接拒绝了。基本上现在已经编写了构造函数。我无法修改它。我可以扩展类或做其他事情,但不能修改构造函数。
-
为什么不像
try { this.socketConnection = initSocket(); }catch(Exception e) { this.socketConnection = null;}那样使用try catch -
@SudhirOjha,因为我无法修改构造函数中的代码。请参阅上面我对 VaughanHilts 的回复。
-
您不能尝试将
super包装起来。
标签: java oop class-design