《Android游戏开发详解》一3.2 getter和setter
本节书摘来异步社区《Android游戏开发详解》一书中的第3章,第3.2节,作者: 【美】Jonathan S. Harbour 译者: 李强 责编: 陈冀康,更多章节内容可以访问云栖社区“异步社区”公众号查看。
3.2 getter和setterAndroid游戏开发详解
构造方法允许你在创建对象的时候初始化对象的实例变量,但是,它对于随后访问或修改这些值就帮不上什么忙了。此外,由于使用了private修饰符来隐藏变量,我们没有办法来直接完成这两项任务。实际上,如下所示的代码将会导致错误。
... // somewhere inside the World class... Coder c3 = new Coder(“Mark”, 30); String c3Name = c3.name; // cannot reference private variable from another class c3.age = 25; // cannot modify private variable from another class
怎样才能绕开这些限制呢?我们可以将Coder类的实例变量标记为public的,但是,由于第2章所介绍的原因,我们不想这么做。相反,可以在Coder类中创建访问器(accessor)方法。我们将讨论两种类型的访问器方法。
1. getter方法返回了所请求的隐藏变量的值的一个副本(但是,保留该隐藏变量不动)。通过这么做,我们可以使得隐藏变量避免未经授权的修改,同时还允许访问该变量的值。
2. setter方法允许其他的类修改一个隐藏变量的值,只要这些类遵守我们在该setter方法中描述的规则。
我们来看看这些访问器方法的应用。向Coder类添加如下所示的getter和setter方法:getAge()、 setAge()、getName()和setName()(参见程序清单3.6的第26行到第28行)。
程序清单3.6 向Coder.java添加getter和setter方法
01 public class Coder { 03 private String name; 04 private int age; 06 public Coder(String name, int age) { 07 this.name = name; 08 this.age = age; 11 public void writeCode() { 12 System.out.println(name + " is coding!"); 15 public void describe() { 16 System.out.println("I am a coder"); 17 System.out.println("My name is " + name); 18 System.out.println("I am " + age + " years old"); 21 public String getName() { 22 return name; 25 public int getAge() { 26 return age; 29 public void setName(String newName) { 30 if (newName != null) { 31 name = newName; 32 } else { 33 System.out.println("Invalid name provided!"); 37 public void setAge(int newAge) { 38 if (newAge 0) { 39 age = newAge; 40 } else { 41 System.out.println("Invalid age provided");
我们的两个getter方法返回了该方法的调用者的name和age变量。这意味着,能够访问(或引用)Coder对象的任何类,都可以调用其getter方法,并且看到Coder的实例变量的值。这里,值是关键字。我们并没有允许访问实例变量最初的版本,而是允许访问存储在其中的值。
两个setter方法允许其他的类修改Coder对象的实例变量,但是,我们可以提供一组规则,以确保这些实例变量不会被非法或无效地修改。在程序清单3.6中,我们的setters拒绝了非正值的age值和null的name值。
让我们在World类中调用getters和setters以测试它们,如程序清单3.7的第8行和第9行所示。
程序清单3.7 在World.java中调用getters和setters
01 public class World { 02 public static void main(String[] args) { 04 Coder c = new Coder("Bill", 59); 05 c.describe(); 06 System.out.println(""); // empty line for readability 08 String cName = c.getName(); 09 int cAge = c.getAge(); 11 System.out.println(cName + ", " + cAge); 12 System.out.println(""); // empty line for readability 13 c.setName("Steve"); 14 c.setAge(-5); // This will be rejected by our setter method 16 c.describe();
输出如下所示的结果。
I am a coder My name is Bill I am 59 years old Bill, 59 I am a coder My name is Steve Invalid age provided
在前面的例子中,我们能够创建一种方法,来保持Coder对象的实例变量私有,同时允许外界通过公有的访问器方法,来获取(get)和修改(set)这些隐藏的变量。这允许我们保持安全地获取和使用私有变量,同时允许我们访问和修改需要的值。注意,我们的setter方法可以拒绝不合法的参数,因此,我们能够防止World类将Coder对象的年龄修改为−5。
异步社区 异步社区(www.epubit.com)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架,于2015年8月上线运营。公众号【异步图书】,每日赠送异步新书。
相关文章
- Android游戏框架Libgdx使用入门
- Android弹球游戏
- 《Android 游戏开发大全(第二版)》——6.4节角色扮演游戏
- 《Android 游戏开发大全(第二版)》——6.10节体育类游戏
- Android游戏开发详解》一第1章 程序设计基础
- 《Android游戏开发详解》一1.3 声明和初始化变量
- 《Android游戏开发详解》一1.7 控制流程第1部分——if和else语句
- 《Android游戏开发详解》一2.10 使用对象
- 《Android游戏开发详解》一2.16 区分类和对象
- 《OpenGL ES 3.x游戏开发(上卷)》一1.2 搭建Android开发环境
- 《Android游戏开发详解》——第1章,第1.8节控制流程第2部分——while和for循环
- 《Android游戏开发详解》——第2章,第2.11节创建新的对象变量
- 《Android游戏开发详解》——第3章,第3.1节构造方法
- 《Android游戏开发详解》——第3章,第3.2节getter和setter
- 《Android游戏开发详解》一1.5 运算
- 《Android游戏开发详解》一2.7 构建一个简单的计数程序
- 《Android游戏开发详解》一2.8 对象的基础知识
- 《Android游戏开发详解》一2.11 创建新的对象变量
- 【Android开发经验】怎样查看android-support-v4支持包中的源代码
- Android学习笔记之:android更新ui的几种经常用法
- Android回调事件传播-android学习之旅(四十五)
- 【winows7+android-ndk-r9+Cygwin 】cocos2dx 2.*游戏移植Android平台完全手册
- [Android] android:visibility属性应用
- 【Android Studio报错】:Failed to read key AndroidDebugKey from store “C:Users13181.androiddebug.keys