我有一个Java实例类,“ResultMaker”仅存在副作用(发送电子邮件),并且该对象永远不会被使用。 (当然这可以重写,以便ResultMaker是一个静态类,但是当我向类中添加“flesh”,添加方法并创建多个实例时,我想我最终会想要对该对象进行引用,所以我在此阶段将ResultMaker声明为实例类的理由是代码尚未完成。)
为了清理r
未被使用的Java警告(请参阅简短的示例代码),我删除了对变量r
的赋值(请参阅代码),因此我只剩下一个{ {1}}。随着代码更改,副作用停止发生,所以我猜想不再发生ResultMaker的实例化。这值得编译器警告(没有实例化)或者这是Java的一个众所周知的方面吗?
new ResultMaker(ans)
答案 0 :(得分:4)
我怀疑你并没有真正看到你认为你所看到的。我非常非常怀疑构造函数调用已被删除。如果你能提供一个简短但完整的程序来证明这个问题,那会有所帮助 - 但我怀疑你会发现这是一些其他的改变 - 可能是你如何观察的副作用 - 发生了。
我强烈建议你把它作为一个静态的方法来描述你期望的副作用 - 一个实际上没有使用结果的构造函数调用是奇怪的,我不会惊讶地看到一个维护者删除调用期待它是一个无操作。构造函数应该的目的是构造一个对象,而不是副作用。
编辑:如果您的代码实际那样,那么第一个我要做的就是更改这些空的异常块:
catch (UnsupportedEncodingException e)
{
}
catch (AddressException e)
{
}
catch (MessagingException e)
{
}
在至少这些应记录出错的地方。
出于调查目的,我还在构造函数调用之前和之后以及构造函数中添加日志记录。这应该有助于说明执行是如何实际流动的。
答案 1 :(得分:1)
由于发送电子邮件的操作几乎是无状态的,因此您可以向ResultMaker
类(MailSender
?)添加方法,类似于r.sendMail(content)
。如果您使用的是Spring或Guice,则可以创建单例并在整个应用程序中注入它。当应用程序启动时,穷人的解决方案将在ResultMaker
中放置ServletContext
实例,并为所有请求重用相同的实例。