我试图用3个构造函数编写一个自定义异常。我可以在3个不同的构造器中初始化最终变量吗?我收到编译错误。如何使此错误消除?
public class CrifServiceFaultException extends RuntimeException {
/**
*
*/
private static final long serialVersionUID = 1L;
public CrifServiceFaultException(String message) {
// // - The blank final field errorDescription may not have been
super(message);
}
public CrifServiceFaultException(String processCode,
String processDescription, String transformCode,
String transformDescription) {
// - The blank final field errorDescription may not have been
initialized
super(processDescription + " " + transformDescription);
this.processCode = processCode;
this.processDescription = processDescription;
this.transformCode = transformCode;
this.transformDescription = transformDescription;
}
public CrifServiceFaultException(String errorCode, String errorDescription) { // The blank final field transformDescription may not have been initialized
super(errorDescription);
setErrorCode(errorCode);
setErrorDescription(errorDescription);
}
final private String processCode;
final private String processDescription;
final private String transformCode;
final private String transformDescription;
final private String errorCode;
final private String errorDescription;
// getters are here
}
因为根据Java规范,每个最终变量都必须在构造函数结束之前初始化。
在每种情况下,对于每个构造函数,您都将其中一些未初始化(通常为空白)。简而言之,您必须为它们设置一个值(即使在特定的构造函数中未使用时):
public CrifServiceFaultException(String message)
{
super(message);
processCode = "";
processDescription = "";
transformCode= "";
transformDescription= "";
errorCode= "";
errorDescription= "";
}
public CrifServiceFaultException(String processCode,
String processDescription, String transformCode,
String transformDescription)
{
super(processDescription + " " + transformDescription);
this.processCode = processCode;
this.processDescription = processDescription;
this.transformCode = transformCode;
this.transformDescription = transformDescription;
errorCode= "";
errorDescription= "";
}
public CrifServiceFaultException(String errorCode, String errorDescription)
{
super(errorDescription);
setErrorCode(errorCode);
setErrorDescription(errorDescription);
processCode = "";
processDescription = "";
transformCode= "";
transformDescription= "";
}
请注意,即使文档中也说明了这一点:
...声明变量final可作为有用的文档...
从这样的句子中,我们可以猜测到,这final
仅仅是一种有用的装饰,可以避免在编译时犯一些小错误(实际上与const
C ++非常相似)。无论如何,IMO都不应该假设final
变量是可变的(即使通过JNI),因为它们可以在运行时实现强大的优化(我在特别考虑HotSpot):考虑并发访问和缓存一致性(尤其是对于原始类型)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句