构造代码块

作者: 许宏川 | 来源:发表于2015-06-14 13:39 被阅读1625次

    假设有个用户类User有这么多属性

    public String userName; //用户名
    public int age; //年龄
    public String phone; //手机号
    public String email; //邮箱
    
    public int vip; //vip等级
    public boolean isManager; //是否管理员
    

    还有三个构造方法

    //构造方法重载
    public User(String userName, int age, String phone, String email) {
    this.userName = userName;
    this.age = age;
    this.phone = phone;
    this.email = email;
    }
    
    public User(String userName, int age, String phone, String email, int vip) {
    this.userName = userName;
    this.age = age;
    this.phone = phone;
    this.email = email;
    
    this.vip = vip;
    }
    
    public User(String userName, int age, String phone, String email, boolean isManager) {
    this.userName = userName;
    this.age = age;
    this.phone = phone;
    this.email = email;
    
    this.isManager = isManager;
    }
    

    你是不是发现,三个构造方法里有大量重复的初始化代码。聪明的你可能一下子就想到了可以把重复的代码提取出来,新建了一个init()把重复代码都丢进去。然后每个构造方法都调用init()。
    例如像这样:

    //构造方法重载
    public User(String userName, int age, String phone, String email) {
    init(userName, age, phone, email);
    }
    
    public User(String userName, int age, String phone, String email, int vip) {
    init(userName, age, phone, email);
    
    this.vip = vip;
    }
    
    public User(String userName, int age, String phone, String email, boolean isManager) {
    init(userName, age, phone, email);
    
    this.isManager = isManager;
    }
    
    //初始化
    void init(String userName, int age, String phone, String email) {
    this.userName = userName;
    this.age = age;
    this.phone = phone;
    this.email = email;
    }
    

    哇,这么一来代码一下子简洁了很多。只不过你还不知道可以使用构造代码块让代码更简洁。我先告诉你代码怎么改:

    public class User {
    
    public String userName; //用户名
    public int age; //年龄
    public String phone; //手机号
    public String email; //邮箱
    
    public int vip; //vip等级
    public boolean isManager; //是否管理员
    
    //构造代码块,会在构造方法之前执行
    {
    System.out.println("构造代码块");
    init(userName, age, phone, email);
    }
    
    //构造方法重载
    public User(String userName, int age, String phone, String email) {
    System.out.println("构造方法1");
    }
    
    public User(String userName, int age, String phone, String email, int vip) {
    System.out.println("构造方法2");
    this.vip = vip;
    }
    
    public User(String userName, int age, String phone, String email, boolean isManager) {
    System.out.println("构造方法3");
    this.isManager = isManager;
    }
    
    //初始化
    void init(String userName, int age, String phone, String email) {
    this.userName = userName;
    this.age = age;
    this.phone = phone;
    this.email = email;
    }
    
    }
    

    为了看到方法的执行顺序,我加了几个输出语句,接着测试一下吧:

    User user1 = new User("张三", 20, "13800138000", "zhangsan@gmail.com");
    User user2 = new User("李四", 20, "13800138000", "lisi@gmail.com", 2);
    User user3 = new User("王五", 24, "13800138000", "wangwu@gmail.com", true);
    

    运行结果:
    <pre>
    构造代码块
    构造方法1
    构造代码块
    构造方法2
    构造代码块
    构造方法3
    </pre>

    从示例你应该你猜出构造方法块是干嘛的了。它在每次new一个新对象时都会被执行,而且是在构造方法之前。所以可以把每个构造方法的重复部分写在构造方法块里。语法就是一对{ }。

    本文代码下载:百度网盘

    相关文章

      网友评论

        本文标题:构造代码块

        本文链接:https://www.haomeiwen.com/subject/neajqttx.html