Java Learning – Getter and Setter
在看到接口和继承时,讲到了setter和getter,那么这两个方法的存在意义到底是什么呢?上网查了下,都没有仔细讲解,只是说应该这样,保护成员变量,那么到底怎么保护?如果不使用,会导致什么?这些很少有人解释,也许是太简单了?!Anyway,下面我将针对这些疑问进行意义解答。
首先什么地方会用到这两种方法?
JAVA是面向对象的(OOB)语言,一切皆为对象,根据《面向接口编程详解(一)思想基础》作者的解释,OOB要符合真实世界的运行状况。在真实世界,很多东西是被隐藏而不被对象(人)所知道,如你不需要知道汽车的内部发动机是如何运行的,只要会开车就行了,开车的界面就是接口,在接口上,我要保证不能通过挪动方向盘就把车玩坏了,所以我给方向盘做了限制,只能左右转动,不能上下转动,因为我的内部机制不了解上下运动,所以这就需要使用setter和gettr的方法,只接收左右信息,不接收上下信息(当然现实中也没上下,只是打比方)。
下面拿一个程序来说明,如果不用setter会有什么后果?
功能类:
package test; public class HelloClass { //private variable private String hello = ""; //setter public void setHello(String val) { if(val=="ok") //prevent ok string this.hello = val; else System.out.println("Initial failed for var hello!"); } //getter public String getHello() { return this.hello; } }
主方法类:
package test; public class Hello { //main function public static void main(String[] args) { HelloClass hello = new HelloClass(); //new HelloClass object hello.setHello("no"); //set the private variable System.out.println(hello.getHello()); //get the private variable and print out } }
如果直接运行主方法类,那么在功能类的setHello方法执行else的语句,这是出于安全考虑,因为我的内部程序只能识别“ok”,其他的变量都不接受。如果在主方法类中直接赋值,如
String hello = ""; // 功能类去掉private hello.hello="No"; //在主方法中直接赋值 //hello.setHello("ok"); 去掉setter方法
这样打印出来的结果就跟你设置的一样了,这就不符合原本的用意了,有时候错误的复制,可能导致内部程序崩溃。
什么时候不需要setter和getter?
如果内部程序对成员变量没有任何限制,那么没有必要用这两种方法,也没有必要设置私有成员变量,但在实际案例中,出于安全考虑,一般都会将成员变量设置为private,并把内部的东西封装起来,不让别人知道,只留出公共接口就可以了
下面是几篇讲解getter和setter不错的文章:
getter和setter方法
Java 入門指南 – getter 與 setter >>> 需要VPN