如何正确组织类代码?

时间:2013-07-23 11:51:36

标签: java code-organization

如果需要通过私有方法修改数据,在类中组织代码的首选方法是什么?

例如,最好这样做:

private String data1;

callMethod(data1);

private void callMethod(String stuff) { 
    // Do stuff to data1
}

或者这个:

private String data1;

callMethod();

private void callMethod() { 
    // Do stuff to data1
}

我已经看到它以各种方式完成,我试图了解什么是行业标准的最佳实践,因为我是新来的发展中国家。

4 个答案:

答案 0 :(得分:3)

如果数据对象是私有的,则该方法具有对它的完全访问权限。你不应该把它传入。

对象将状态和行为封装到单个软件模块中。操作应该操纵状态。

答案 1 :(得分:1)

如果你知道这个参数是类私有成员,我没有看到用参数创建私有函数的意义。如果函数是特定的,其结果取决于成员状态,那么我总是选择第二个选项。

答案 2 :(得分:1)

这实际上取决于数据,方法以及您要做的事情。换句话说,这是班级设计的一部分。

此私有方法如何修改数据?如果它执行仅对data1字段有意义的特定计算,那么您只需使用callMethod()

另一方面,如果您的callMethod()可能是班级中的一个小实用程序(也许可以在两个不同的字段data1data2上执行相同的计算)那么它是有意义的没有两个单独的方法,但传递成员作为参数进行修改。

如果您有一个具体的例子,那么我们可能会提供更多帮助

答案 3 :(得分:1)

如果方法已经知道它必须访问的成员,那么在内部传递引用是没有意义的。

class FooHolder {
    private Foo foo;

    private void ensureInitialized() {
        if (foo == null)
            foo = new Foo();
    }

    public Foo getFoo() {
        ensureInitialized();
        return foo;
    }
}

但如果你能以这种方式防止代码重复,那么这样做有时很有用。这些内部实用程序方法有时可能是静态的,如下所示:

class FooAndBar {
    private List<Foo> foos;
    private List<Bar> bars;

    public void addFoo(Foo foo) {
        foos = ensureList(foos);
        foos.add(foo);
    }

    public void addBar(Bar bar) {
        bars = ensureList(bars);
        bars.add(bar);
    }

    // assume this method is not generically useful and therefore not better off in a utility class
    private static <T> List<T> ensureList(List<T> list) {
        return list != null ? list : new ArrayList<T>();
    }
}

有时他们不能/不应该

class FooFoos {
    private final Map<String, List<Foo>> fooMap = new HashMap<String, List<Foo>>();
    private List<Foo> getListForKey(String key) {
        List<Foo> list = fooMap.get(key);
        if (list == null) {
            list = new ArrayList<Foo>();
            fooMap.put(key, list);
        }
        return list;
    }

    public void addFoo(String key, Foo foo) {
        getListForKey(key).add(foo);
    }
    public List<Foo> getList(String key) {
        return getListForKey(key);
    }
}

请注意,getListForKey未传递对fooMap的引用。不是必要的,因为该部分已经很清楚,并且在每种方法中输入它都会使代码混乱。

如果您可以通过这种方式实现更少的代码重复和一些内部封装,则将引用传递给您的私有方法。但如果由于每个方法都必须再次指定引用,那么不要这样做会导致更多的代码。

另请注意,通过方法进行的大量内部功能封装意味着您应该考虑将该功能重构为另一个类。对于最后一个示例,请考虑使用/创建类似MultiMap

的内容