Java构造函数仅用于副作用

时间:2011-03-20 08:44:28

标签: java

我有一个Java实例类,“ResultMaker”仅存在副作用(发送电子邮件),并且该对象永远不会被使用。 (当然这可以重写,以便ResultMaker是一个静态类,但是当我向类中添加“flesh”,添加方法并创建多个实例时,我想我最终会想要对该对象进行引用,所以我在此阶段将ResultMaker声明为实例类的理由是代码尚未完成。)

为了清理r未被使用的Java警告(请参阅简短的示例代码),我删除了对变量r的赋值(请参阅代码),因此我只剩下一个{ {1}}。随着代码更改,副作用停止发生,所以我猜想不再发生ResultMaker的实例化。这值得编译器警告(没有实例化)或者这是Java的一个众所周知的方面吗?

new ResultMaker(ans)

2 个答案:

答案 0 :(得分:4)

我怀疑你并没有真正看到你认为你所看到的。我非常非常怀疑构造函数调用已被删除。如果你能提供一个简短但完整的程序来证明这个问题,那会有所帮助 - 但我怀疑你会发现这是一些其他的改变 - 可能是你如何观察的副作用 - 发生了。

我强烈建议你把它作为一个静态的方法来描述你期望的副作用 - 一个实际上没有使用结果的构造函数调用是奇怪的,我不会惊讶地看到一个维护者删除调用期待它是一个无操作。构造函数应该的目的是构造一个对象,而不是副作用。

编辑:如果您的代码实际那样,那么第一个我要做的就是更改这些空的异常块:

catch (UnsupportedEncodingException e)
{
}
catch (AddressException e) 
{
} 
catch (MessagingException e) 
{
}

至少这些应记录出错的地方。

出于调查目的,我还在构造函数调用之前和之后以及构造函数中添加日志记录。这应该有助于说明执行是如何实际流动的。

答案 1 :(得分:1)

由于发送电子邮件的操作几乎是无状态的,因此您可以向ResultMaker类(MailSender?)添加方法,类似于r.sendMail(content)。如果您使用的是Spring或Guice,则可以创建单例并在整个应用程序中注入它。当应用程序启动时,穷人的解决方案将在ResultMaker中放置ServletContext实例,并为所有请求重用相同的实例。