交代背景:

最先接触这一规范是在.Net中写实体类的时候,当时就非常奇怪为什么不在实体中直接将变量定义为共有,这样的话在其他的方法调用实体类的时候同样可以为实体中某个变量赋值或取得实体类中的某个变量的值。那样的话代码量明显减少而且和写get、set方法的效果极其的相似。

代码1:在实体类中加属性方法
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace Model
{
    public class Category
    {
        private string id;
        /// <summary>
        /// 主键,自增
        /// </summary>
        public string Id
        {
            get
            {
                if (id == null)
                {
                    id = "";
                }
                return id;
            }
            set { id = value; }
        }


 
        private string name;
        /// <summary>
        /// 类别名称
        /// </summary>
        public string Name
        {
            get
            {
                if (name == null)
                {
                    name = "";
                }
                return name;
            }
            set { name = value; }
        }
        public Category(string id, string name)
        {
            this.id = id;
            this.name = name;
        }
    }
}
代码2:在实体使用公共变量
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace Model
{
    public class Category
    {
        public string id;
        public string name;
 
        public Category(string id, string name)
        {
            this.id = id;
            this.name = name;
        }
    }
}
  • 但是在调用的时候都可以满足基本传递数值的作用。

产生这么相似结果的原因就是C#这个语言设计的太人性化了,在给属性赋值或者取属性的值的时候直接就可以用类名“点”出来。而java就没有那样做

JavaBean中属性代码

package com.xxy.drp.sysmgr.domain;
 
import java.util.Date;
 
/**
 * 用户实体类
 * 
 * @author yong
 * 
 */
public class User {
	// 用户代码
	private String userId;
 
	// 用户姓名
	private String userName;
 
	// 密码
	private String password;
 
	// 联系电话
	private String contactTel;
 
	// 电子邮件
	private String email;
 
	// 创建日期
	private Date createDate;
 
	public String getUserId() {
		return userId;
	}
 
	public void setUserId(String userId) {
		this.userId = userId;
	}
 
	public String getUserName() {
		return userName;
	}
 
	public void setUserName(String userName) {
		this.userName = userName;
	}
 
	public String getPassword() {
		return password;
	}
 
	public void setPassword(String password) {
		this.password = password;
	}
 
	public String getContactTel() {
		return contactTel == null ? "" : contactTel;
	}
 
	public void setContactTel(String contactTel) {
		this.contactTel = contactTel;
	}
 
	public String getEmail() {
		return email == null ? "" : email;
	}
 
	public void setEmail(String email) {
		this.email = email;
	}
 
	public Date getCreateDate() {
		return createDate;
	}
 
	public void setCreateDate(Date createDate) {
		this.createDate = createDate;
	}
}

java更加接近于机器的思想,在写属性的时候需要写set和get方法,而且给属性赋值以及取得属性值的时候必须调用这两个方法。相比较C#而言,这样使得编程人员更容易区分属性和公共变量。

PS:C#(或者说Net)和java各有各的好处吧,C#更加人性化,说白了就是更傻瓜一点,把很多东西都隐藏起来了,可以帮助开发人员快速的进行开发;而java是给编程人员暴露了很多东西,虽然使得初学者学起来明显感觉知识庞大,但是为以后更深入的理解代码做好了铺垫(笔者觉得这点至关重要)。

分析如下:

试想这么一个场景,你的名字叫做张三,首先这是父母给的名字,那么这个名字一旦确定就不应该随便更改(并不是一定不能改)那么在改的过程中就应该判断一下了,假如别人把你的名字改为“狗剩”之类不雅之词恐怕你不一定愿意,但是改成一个好听的么名字你兴许就会考虑考虑了。

  • 下面用代码的方式思考上面的场景:

父母起名字类似于初始化JavaBean(或者说一个类)的时候为其一个属性进行赋值,在这个故事中名字就是你的一个属性(它应该保存在一个内部变量中)。而你自身有一个方法叫做“我想改名(新名字)”。

这样的话代码1的解释就是:某人给你改名字,然后你直接就把他给的字符串改为自己的名字,这是多么恐怖的一件事情,本来属于你的东西别人竟然可以随便更改!

代码2的解释就是:某人给你改名字,在得到这个字符串后,你考虑了一下这个名字是否是个好名字然后再决定是不是进行更改,nice!

聪明的你已经可以看出来哪个代码更有道理了。好了,这下清楚了,把变量定义成私有防止别人胡乱更改,但是如果真的需要更改就通过共有的方法进行更改,在方法中加上必要的些判断防止他人胡乱更改。

综上所述:

属性私有是为了安全封装,方法共有是为了方便调用(方法为了供他人调用所以需要写成共有的,属性)。