仅用于副作用的 Java 构造函数

标签 java

我有一个 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/

相关文章:

java - 在 "BEGIN-OF-STATEMENT"之后找到 CallableSamentment 。预期的 token 可能包括 : "<space>"

java - VPS、Java、连接超时和内存不足

java - 递归选择排序 (Java Eclipse Neon 2)

java - (Android/Java)创建RSA私钥实例

java - 是否可以使用 "if condition"中的多种情况来访问相同的功能

java - 格式 BigDecimal jsf 2.0

java - 每次调用 isEmailVerified() 都会返回错误条件,即使在验证电子邮件之后

java - 让应用程序运行在其他应用程序之上

java - 如何在新选项卡中显示打印的文档?

java - Neo4j - 使用 Java API 获取属于索引的所有节点