方法為了供他人調用所以需要寫成共有的,這無需贅言,下面重點說說屬性那檔子事兒。
交代背景:
最先接觸這一規范是在.Net中寫實體類的時候,當時就非常奇怪為什么不在實體中直接將變量定義為共有,這樣的話在其他的方法調用實體類的時候同樣可以為實體中某個變量賦值或取得實體類中的某個變量的值。那樣的話代碼量明顯減少而且和寫get、set方法的效果極其的相似。
代碼1:在實體類中加屬性方法
// <copyright file="Category.cs" company="YONG"> // Copyright (c) 2011 YONG. All rights reserved. // </copyright> // <author>郗曉勇</author> // <author>我的博客地址http://blog.csdn.net/beijiguangyong</author> // <date>2011/5/21 15:57:15</date> // <description> //新聞類別實體類 // // // // </description> 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:在實體使用公共變量
// <copyright file="Category.cs" company="YONG"> // Copyright (c) 2011 YONG. All rights reserved. // </copyright> // <author>郗曉勇</author> // <author>我的博客地址http://blog.csdn.net/beijiguangyong</author> // <date>2011/5/21 15:57:15</date> // <description> //新聞類別實體類 // // // // </description> 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!
聰明的你已經可以看出來哪個代碼更有道理了。好了,這下清楚了,把變量定義成私有防止別人胡亂更改,但是如果真的需要更改就通過共有的方法進行更改,在方法中加上必要的些判斷防止他人胡亂更改。
綜上所述:
屬性私有是為了安全封裝,方法共有是為了方便調用。