Java 常见问题思考

时间:2021-06-09 18:55:40

Java中的成员变量是选择在声明时赋值还是在构造函数中赋值?

 // 通过构造函数赋值
 public class UserRequestImpl extends ModuleImplBase {

     private UserRequestBean bean; 

     public UserRequestImpl(WebDriver driver) {
         super(driver);
         bean = new AttestationUserRequestBean();
     }
 }

 // 在声明成员变量时即赋值
 public class UserRequestImpl extends ModuleImplBase {

     private UserRequestBean bean = new UserRequestBean(); 

     public UserRequestImpl(WebDriver driver) {
         super(driver);
     }
 }

在多态情况下,这2种赋值方法尤其需要注意。比如类Demo有个Map类型成员变量,如果直接赋值,那么就必须要指定这个Map是何种Map,而通过构造函数赋值,这个就不确定了,有可能是各种Map的实现。所以,通过构造函数与set方法赋值,能够使程序更加的灵活,也能够体现多态的面向对象的特征。
那么什么情况下直接赋值比较好呢?我建议一些不会变化(比如常量 )或者明确指定实现的依赖,比如记录日志的Log,这种一般我建议写成final以及static的,搞Web多线程的,能节约点内存就节约点内存,不是怕内存不够,现在服务器内存都几十G了,内存很便宜了,真正是为了节约JVM在GC上消耗的时间。

总之:

  • 通过构造函数或者set方法注值,使得程序更加灵活,不要把变量和方法写成静态的 这样有利于通过继承扩展原有对象,实现多态,而写成静态的就不行了 就没法实现多太了。
  • 直接赋值,在某种情况下能够节约内存开销。
  • 构造函数中对私有变量赋值的好处是在定义对象时会初始化,是否加一个独立的setter函数就要考虑程序在会不会在其他地方允许改变私有变量的值。
  • 另外如果在成员变量声明的时候和构造函数中都有赋值操作 会按照先执行成员变量声明时的赋值然后调用构造函数赋值。 所以最终以构造函数为准。