说我有这样的课程:
public class FileMethods {
private static final Document doc=DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
public static void doSomething(){
}
}
我如何正确初始化文档?这当前抛出了编译错误(未捕获的异常),因此可以在没有显式方法调用的情况下初始化doc吗?
答案 0 :(得分:7)
最好在静态初始化方法中初始化您的doc。使用该方法的优点是您可以将初始化包装在try/catch
块中。
答案 1 :(得分:1)
---编辑因为长篇答案不适合评论---
我将引用c2.com模式和反模式讨论论坛,在这里可以深入探讨面向对象思维的复杂性,并仔细考虑不同方法的优缺点。
为了提供更多功能,这是对封装的根本性破坏 访问私人国家比他们需要的。实用方法是 作为一个类的成员通常被授予比他们更多的访问权限 要求,使识别和执行设计不变量变得更加困难。 如果方法的功能可以用类来表示 公共接口,然后将其写为非成员函数增加 整体封装。
具有所有静态方法的类最终必须使用传递给它的类中的所有数据和项来打扰它。这会导致许多问题。
列表继续,但如果您认为您的情况值得特别考虑,那么请使用静态方法。
---原帖如下---
具有所有静态成员和方法的类非常有问题。为什么不创建一个实例,如此
public class FileMethods {
private final Document doc;
public FileMethods() {
doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
}
public void doSomething() {
doc.checkSomething();
doc.doSomething();
doc.doSomethingElse();
}
}
就是这样。您现在可以同时处理两个文档。您还可以在单元测试框架中测试FileMethods类(没有一些真正的后向代码)。
至于例外。
try {
doc = ...;
} catch (SomeCompilerException e) {
e.printStackTrace();
}
是一个好的开始。更好的是,如果您无法处理该代码块中的异常......
public FileMethods() throws SomeCompilerException {
doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
}
并在有意义的代码块中处理它。
try {
FileMethods methods = new FileMethods();
methods.doSomething();
} catch (SomeCompilerException e) {
System.out.println("Not possible to make a document right now due to " + e);
}