在Java中设置Inner类实例的字段值的更好方法

时间:2014-01-10 14:31:53

标签: java inner-classes

我的bean类中有一个内部bean类。在MyBean类方法中,我将创建一个内部bean类的实例,然后设置一些字段值。请参阅我的示例代码。

我的问题是:WAY 1是否比WAY 2更好,因为我们直接将值设置为字段?我们应该采用哪种方式?谢谢。

public class MyBean {

public void myMethod() {
    String p1 = "calculate p1";
    String p2 = "calculate p2";

    // WAY 1
    InnerBean innerBean = new InnerBean();
    innerBean.p1 = p1;
    innerBean.p2 = p2;

    // WAY 2
    InnerBean innerBean = new InnerBean(p1,p2);
    innerBean.doSomething();
}

// WAY 1
private class InnerBean {

    private String p1;
    private String p2;

    public void doSomething() {
        System.out.println(p1 + p2);
    }
}

// WAY 2
private class InnerBean {

    private String p1;
    private String p2;

    public InnerBean1(String p1, String p2) {
        this.p1 = p1;
        this.p2 = p2;
    }

    public void doSomething() {
        System.out.println(p1 + p2);
    }
}
}

4 个答案:

答案 0 :(得分:1)

我认为性能不会有显着差异。这更像是设计和风格的问题。

常用的方法是使用构造函数或setter和getter。这符合“信息隐藏”的设计原则。由于这将是大多数开发人员期望看到的方式,因此对于我们大多数人来说这也更容易阅读。

但是由于内部类是私有的,我会说使用直接访问内部类的字段是绝对可以的,如果这在您的团队中很常见的话。这可能会导致细长的代码。

答案 1 :(得分:1)

我会使用构造函数,但如果你不打算将嵌套类移到外面,这在这种情况下并不重要。

如果这些字段是不可变的,那么将它们声明为final并使用构造函数是最简洁的方法。

此外,如果嵌套类不需要引用外部作用域(即类MyBean),则应将其声明为static

答案 2 :(得分:0)

在第一种方式中,您实际使用的是InnerBean的默认构造函数,因为它未被声明。这是因为java如果没有声明构造函数,则接受使用InnerBean()并设置p1 = ""; , p2 = "";的字符串值 之后您实际做的是使这些字符串指向其他东西而不是空字符串。

// WAY 1
InnerBean innerBean = new InnerBean();
innerBean.p1 = p1;
innerBean.p2 = p2;

在第二种方式上,重写了java默认构造函数,并将值作为参数传递。我建议这样,因为你应该在你的班级中提供一个构造函数。

// WAY 2
InnerBean innerBean = new InnerBean(p1,p2);
innerBean.doSomething();

除此之外,考虑到方式2的步骤数量需要更少。因为在第一种情况下,您使用预定义值创建对象,然后更改指针,而在第二种情况下,您只需使用给定值创建对象。

答案 3 :(得分:0)

我总是使用构造函数,因为未初始化的类变量会导致很多错误。 Eclipse,IntelliJ和大多数其他现代IDE可以从类变量列表中生成构造函数,以免您手动输入它。我在Java之前做了C ++,不完整的类初始化引起的痛苦使我感谢Java更清晰的类初始化逻辑。对于像你的私人课程这样的琐碎案例,没有多大意义,但我总是努力保持最佳实践。