类成员的直接初始化与在方法中执行它有什么区别?

时间:2015-11-09 07:41:17

标签: java static class-members

我已经完成了Google Foobar任务,并且很好奇为什么2个实现(看起来是等效的)以不同的方式工作。当第二个解决方案通过所有测试用例时,第一个给我带来“测试2失败”。我知道他们两个都没有遵循最好的OOP实践,但我很有意思第一个实现的确切问题是什么。

1

public class Answer {
    static Map<Character, LinkedList<Character>> g;
    static Set<Character> visited;
    static ArrayList<Character> ans;

    public static void dfs(char v) {
        visited.add(v);
        //some standard code for DFS
        ans.add(v);
    }

    public static String topologicalSort() {
        visited = new HashSet<Character>();
        ans = new ArrayList<Character>();

        for (Character element : g.keySet()) {
            if (!visited.contains(element))
                dfs(element);
        }

        //some code to prepare the output
    }

    public static void builGraph(String[] words) {

        g = new HashMap<Character, LinkedList<Character>>();

        //some code to build adjacency list and then use it through g reference 
    }

    public static String answer(String[] words) {

        if (words.length == 1) {
            //some code
        }

        builGraph(words);

        return topologicalSort();
    }

    public static void main(String[] args) {
        //some code
        System.out.println(answer(words));
    } 
}

2

$ ./manage.py import_project --name-template 'Directory 1: %s' \
    --file-format po \
    project https://github.com/project/docs.git master \
    'docs/locale/*/LC_MESSAGES/dir1/**.po'
$ ./manage.py import_project --name-template 'Directory 2: %s' \
    --file-format po \
    project https://github.com/project/docs.git master \
    'docs/locale/*/LC_MESSAGES/dir2/**.po'

2 个答案:

答案 0 :(得分:1)

在第一个实现中,您在哪里清除容器(Map,Set,ArrayList)? 测试用例可能多次调用answer(),所以 我会将answer()方法从第一个实现改为:

public static String answer(String[] words) {
    this.g.clear();
    this.visited.clear();
    this.ans.clear();

    // ...
}

答案 1 :(得分:0)

我不知道测试的内容,所以我不知道它为什么会失败。但是,很容易区分两种实现之间的差异。

在Java中(引用4.12.5. Initial Values of Variables):

  

对于所有引用类型(§4.3),默认值为// within another loop: Object polygon_object = my_polygons.get(polygon_id);

第二种情况下的对象会被分配my_polygon.contains(x, y); ,直到您初始化它们为止,并且您在{em>每次调用null时都会这样做。因此,每次调用该方法时,都会创建一个 new 对象。

在第一个实现中,您只需初始化它们一次 - 创建类时。这应该足以让您更深入地研究问题并更好地理解为什么测试在第一次实现中失败。