我有一个 Java 实例类“ResultMaker”,它的存在只是为了产生副作用(发送电子邮件),并且该对象以后再也不会被使用。 (当然这可以重写,使 ResultMaker 成为一个静态类,但是当我向类添加“肉体”、添加方法并创建多个实例时,我想我最终会想要引用该对象,所以我在此阶段将 ResultMaker 声明为实例类的理由是代码尚未完成。)
为了清除 r
未使用的 Java 警告(参见简短的示例代码),我删除了对变量 r
的赋值(参见代码),所以我只剩下一个 new ResultMaker(ans)
。随着代码更改,副作用不再发生,所以我猜 ResultMaker 的实例化不再发生。这是值得编译器警告(没有实例化)还是这是 Java 的一个众所周知的方面?
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws IOException, ServletException
{
Thing tt = new Thing();
String answer = tt.DoSomething();
ResultMaker r = new ResultMaker(answer);
resp.getWriter().println(answer);
}
最佳答案
我怀疑您并没有真正看到您认为自己看到的东西。我非常非常怀疑构造函数调用是否已被删除。如果您可以提供一个简短但完整的程序来演示问题,那会有所帮助 - 但我怀疑您会发现它是一些其他变化 - 可能是您观察副作用的方式 - 即发生了。
我强烈建议您将其设为一个静态方法,它描述了您所期望的副作用 - 一个实际上不使用结果的构造函数调用很奇怪,我不会惊讶地看到维护者删除调用 expecting 它是一个空操作。构造函数的目的应该是构造一个对象,而不是为了产生副作用。
编辑:如果您的代码实际上是那样的,那么我要做的第一就是更改这些空的异常 block :
catch (UnsupportedEncodingException e)
{
}
catch (AddressException e)
{
}
catch (MessagingException e)
{
}
至少这些应该记录出了什么问题。
出于调查目的,我还会在构造函数调用前后以及构造函数内添加日志记录。这应该有助于显示执行的实际流程。
关于仅用于副作用的 Java 构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5367523/