运行代码以生成静态变量

时间:2013-08-26 00:57:27

标签: java static

说我有这样的课程:

public class FileMethods {

private static final Document doc=DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();

public static void doSomething(){
}

}

我如何正确初始化文档?这当前抛出了编译错误(未捕获的异常),因此可以在没有显式方法调用的情况下初始化doc吗?

2 个答案:

答案 0 :(得分:7)

最好在静态初始化方法中初始化您的doc。使用该方法的优点是您可以将初始化包装在try/catch块中。

答案 1 :(得分:1)

---编辑因为长篇答案不适合评论---

我将引用c2.com模式和反模式讨论论坛,在这里可以深入探讨面向对象思维的复杂性,并仔细考虑不同方法的优缺点。

  

为了提供更多功能,这是对封装的根本性破坏   访问私人国家比他们需要的。实用方法是   作为一个类的成员通常被授予比他们更多的访问权限   要求,使识别和执行设计不变量变得更加困难。   如果方法的功能可以用类来表示   公共接口,然后将其写为非成员函数增加   整体封装。

具有所有静态方法的类最终必须使用传递给它的类中的所有数据和项来打扰它。这会导致许多问题。

  1. 它反转封装,因为行为永久地在类外部。例如,下面示例中的“doSomething”不属于任何类实例。反向封装==类似结构的类,缺乏解决问题所需的关键行为。
  2. 使单元测试变得复杂。我可以尝试快速举例说明,但this covers it far better than I would be able to do so quickly
  3. 它使您的代码很难以易于预见需要维护的方式进行维护。有没有想过你可能需要第二份文件?有趣的剪切和粘贴(一种错误注入技术),或将您的东西转换为实例(通过代码进行有趣的搜索),这样您就可以拥有基类和子类来实现差异。从实例开始,您只需要标记实例类abstract,创建两个子类文件,并将一个方法移动到“was default”子类中,为另一个子类编写方法。没有通过代码库狩猎==获胜。
  4. 所有静态类都很难卸载。如果不使用它们,没有一些非常奇特的类加载,就不可能减少内存。
  5. 所有静态类都非常难以提高性能。没有能力为每个线程或每个并行任务的类创建一个类。不保证在方法调用之间可以阻止其他线程调用方法。通过实例,您可以创建线程私有实例。
  6. 列表继续,但如果您认为您的情况值得特别考虑,那么请使用静态方法。

    ---原帖如下---

    具有所有静态成员和方法的类非常有问题。为什么不创建一个实例,如此

    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);
     }