在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java/ 為什么要提供getter 和setter方法?

為什么要提供getter 和setter方法?

一個類提供這兩個方法,通常都是public的,意味著任何地方都可以new一個對象然后通過setter修改他們的成員變量,那這個成員變量修飾為private有用什么作用?何不直接就實例.屬性修改?

回答
編輯回答
初念

Java封裝是否多余?

我們在學(xué)習(xí)Java的時候,書上告訴我們面向?qū)ο蠖际蔷哂蟹庋b性的。那怎么體現(xiàn)封裝性呢?就是將我們的成員變量用private進行修飾。

給出這個成員變量的set、get方法。這樣就體現(xiàn)了封裝性了。

那我們有沒有想過,這是為什么呢??我們每次都要寫一大堆的set、get方法,干嘛呢??就為了體現(xiàn)它這么一個封裝性??封裝性又體現(xiàn)在哪呢??

我們?nèi)粘V薪o這些變量賦值的時候都是setXXX()這樣子。

那如果我們不設(shè)置成private,直接設(shè)置成public的話。賦值起來不是更加簡單??例如:


    Person p = new Person();

    //age定義成public的,我們就直接賦值了
    p.age = "22";


    //name定義成private,我們要通過方法來進行賦值。
    p.setName("zhongfucheng");

看完上邊的代碼,我們會發(fā)現(xiàn):封裝性究竟體現(xiàn)在哪??這不是搞我嗎?他倆實現(xiàn)的效果不是一樣的嗎?都是賦值而已啊。

對啊,對于上面的代碼,確實是這樣的。如果自己用的話,那他倆實際的效果是一樣的,沒啥多大的區(qū)別。

那我們?yōu)槭裁匆庋b?

我覺得java中需要封裝,有下面幾個原因:

  • 我們可以在set方法中做其他的事,比如用戶傳遞進來一個名字”傻逼“,我們判斷這個名字是否合法,如果不合法就不給他取了。也就是說:我們可以在set方法中做邏輯判斷,可以干該屬性相關(guān)的事。
  • JavaBean規(guī)范就是對成員變量對其修飾為私有,給出對應(yīng)的set、get方法。這是一種規(guī)范。那我們打破這個規(guī)范會怎么樣??可以說:絕大部分的Java框架、類庫在使用的時候都是調(diào)用set、get方法來設(shè)置數(shù)據(jù)、獲取數(shù)據(jù)。如果我們不遵守這個規(guī)范,那么我們的類庫都用不了啦。
  • 假設(shè)我們使用的是public來修飾成員變量,我們這個成員變量已經(jīng)被多個類使用了??墒怯幸惶欤覀儼l(fā)現(xiàn)這個成員變量要做的事情不僅僅是賦值,還有別的事要干(這個變量的值需要加上一些數(shù)據(jù))。那就慘了,需要我們找到每個用這個變量的地方。如果我們使用了set、get的話,那么我們只要該了set、get方法的內(nèi)部,其他的數(shù)據(jù)都全變了。

我覺得第二點和第三點是我們需要使用Java中set、get方法的主要原因。

2018年3月31日 07:30
編輯回答
情未了
2017年8月18日 18:17
編輯回答
清夢

由于stackoverflow上已有人提出過這個問題,并且解答也很好,我就直接搬運最高票過來,并稍作翻譯。

  • Encapsulation of behavior associated with getting or setting the
    property - this allows additional functionality (like validation) to
    be added more easily later.
  • 對與get&set類屬性有關(guān)的類的行為進行封裝可以方便以后增加其他功能(比如驗證)
  • Hiding the internal representation of the property while exposing a
    property using an alternative representation.
  • 用不同于內(nèi)部的展現(xiàn)方式對外公布屬性
  • Insulating your public interface from change - allowing the public
    interface to remain constant while the implementation changes without
    affecting existing consumers.
  • 避免對外接口發(fā)生變化 —— 當(dāng)實現(xiàn)發(fā)生變化時,對外接口不變,不會影響到現(xiàn)有的調(diào)用方
  • Controlling the lifetime and memory management (disposal) semantics
    of the property - particularly important in non-managed memory
    environments (like C++ or Objective-C).
  • 控制屬性的生命周期和內(nèi)存管理 —— 在無內(nèi)存管理的環(huán)境中尤其重要(比如C++和Objective-C)
  • Providing a debugging interception point for when a property changes
    at runtime - debugging when and where a property changed to a
    particular value can be quite difficult without this in some
    languages.
  • 當(dāng)屬性的值在運行時發(fā)生變化的時候,提供一個調(diào)試入口 —— 在某些語言中調(diào)試屬性值的變化是很困難的
  • Improved interoperability with libraries that are designed to operate
    against property getter/setters - Mocking, Serialization, and WPF
    come to mind.
  • 提高與那些操作屬性的getter/setter的庫的互通性 —— 比如Mocking(單測常用的東西,我平時也直接說Mock,不知道怎么翻譯), 序列化, WPF等等
  • Allowing inheritors to change the semantics of how the property
    behaves and is exposed by overriding the getter/setter methods.
  • 允許子類繼承并覆寫修改屬性的行為的語義
  • Allowing the getter/setter to be passed around as lambda expressions
    rather than values.
  • 允許getter/setter作為lambda表達(dá)式而不是值進行傳遞
  • Getters and setters can allow different access levels - for example
    the get may be public, but the set could be protected.
  • getter/setter可以有不同的可訪問性,比如get可以public而set則是protected
2017年7月6日 04:37
編輯回答
愛礙唉

第一個是數(shù)據(jù)安全性
第二個大部分的框架需要要到反射機制 ,比如struts mybtais和hibernate等等 都是需要get和set方法的

2017年9月2日 05:24
編輯回答
挽歌

這屬于封裝,直接暴露屬性就意味著你沒有辦法在不修改API的情況下改變數(shù)據(jù)的表示方法。
采用getter setter 你就可以擴展你自己的類,但是調(diào)用者不需要改變

2018年2月5日 19:02