【发布时间】:2017-10-11 19:13:24
【问题描述】:
我喜欢使用 java 中的静态方法,例如在 Util 类中。但是在一些同事中,我遇到了一些论点,即静态方法不应该使用外部资源。但没有人能解释为什么它应该是坏的甚至是危险的。我发现的唯一原因是在测试期间可能很难模拟该外部资源。但这真的是唯一的原因吗?
下面我有一个静态方法的例子。我很想了解为什么将它与静态一起使用应该是一种不好的方法。
public class JmsUtil {
public static String sendBytesMessage(byte[] messageBytes) throws JMSException, NamingException {
String jmsMessageID = null;
Connection connection = null;
try {
Context context = new InitialContext();
ConnectionFactory connectionFactory = (ConnectionFactory) context.lookup("ourfactory");
Queue queue = (Queue) context.lookup("ourqueue");
connection = connectionFactory.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer messageProducer = session.createProducer(queue);
BytesMessage bytesMessage = session.createBytesMessage();
bytesMessage.writeBytes(messageBytes);
messageProducer.send(bytesMessage);
jmsMessageID = bytesMessage.getJMSMessageID();
} finally {
if (connection != null) {
connection.close();
}
}
return jmsMessageID;
}
}
最好的问候
【问题讨论】:
-
静态方法没有错。这取决于你需要什么。有一些很棒的工具,比如 apache common,实际上是 StringUtils,它有很多静态方法。如果你想模拟静态的东西,你可以使用 Powermock。无论如何,这个问题对我来说似乎有点离题,因为这更像是一个基于意见的事情。
-
sendBytesMessage在您的示例代码中未标记为static -
静态方法使得在测试中模拟外部资源变得困难(或者不可能,如果你不想使用类似 PowerMockito 的话)。也许阅读Static methods are death to testability。
-
“但这真的是唯一的理由吗?”这是一个相当大的原因。如果您无法在不访问外部资源的情况下测试您的代码,那么您的测试将不会被编写、不会运行,或者将取决于静态资源的状态。
标签: java static static-methods