《Android游戏开发详解》一3.2 getter和setter

3.2 getter和setter

Android游戏开发详解
构造方法允许你在创建对象的时候初始化对象的实例变量,但是,它对于随后访问或修改这些值就帮不上什么忙了。此外,由于使用了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 {
02
03     private String name;
04     private int age;
05
06     public Coder(String name, int age) {
07         this.name = name;
08         this.age = age;
09     }
10
11    public void writeCode() {
12        System.out.println(name + " is coding!");
13    }
14
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");
19    }
20
21    public String getName() {
22        return name;
23    }
24    
25    public int getAge() {
26        return age;
27    }
28    
29    public void setName(String newName) {
30        if (newName != null) {
31            name = newName;
32        } else {
33            System.out.println("Invalid name provided!");
34        }
35    }
36    
37    public void setAge(int newAge) {
38        if (newAge > 0) {
39            age = newAge;
40        } else {
41            System.out.println("Invalid age provided");
42        }
43    }
44 }

我们的两个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) {
03      
04        Coder c = new Coder("Bill", 59);
05        c.describe();
06        System.out.println(""); // empty line for readability
07  
08        String cName = c.getName();
09        int cAge = c.getAge();
10
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
15
16        c.describe();
17    }
18
19 }

输出如下所示的结果。

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。

时间: 2024-09-20 04:06:55

《Android游戏开发详解》一3.2 getter和setter的相关文章

《Android游戏开发详解》一2.20 对象的更多实践——模拟一个色子

2.20 对象的更多实践--模拟一个色子 Android游戏开发详解 在我们的下一个项目中,将模拟一个六面色子的滚动.色子会出现在许多现代的桌上游戏中,因为它们增添了不可预期的因素,如图2-26所示.在本节中,我们将展示在Java程序中如何模拟这种随机性. 我们首先创建一个名为"DiceProject"的新的Java项目.其中,创建一个名为DiceMaker的新的类,并且像通常一样给它一个main方法. 要产生一个随机数,我们必须使用Java库中名为Random的一个内建类.我们使用熟

《Android游戏开发详解》——第2章,第2.20节对象的更多实践——模拟一个色子

2.20 对象的更多实践--模拟一个色子 Android游戏开发详解 在我们的下一个项目中,将模拟一个六面色子的滚动.色子会出现在许多现代的桌上游戏中,因为它们增添了不可预期的因素,如图2-26所示.在本节中,我们将展示在Java程序中如何模拟这种随机性. 我们首先创建一个名为"DiceProject"的新的Java项目.其中,创建一个名为DiceMaker的新的类,并且像通常一样给它一个main方法. 要产生一个随机数,我们必须使用Java库中名为Random的一个内建类.我们使用熟

《Android游戏开发详解》——第1章,第1.3节声明和初始化变量

1.3 声明和初始化变量 Android游戏开发详解 所有的基本数据类型(和字符串)都可以表示为变量.它们都是使用相同的基本语法来声明(创建)的. 创建一个新的变量的时候,我们总是要声明两件事情:变量的数据类型(data type)和变量的名称(variable name).在大多数情况下,我们还使用赋值运算符(assignment operator,即=)给变量指定一个初始值.有两种方法做到这点.第一种方法是指定一个字面值(literal value),例如,图1-1所示的'J'.第二种方法是

《Android游戏开发详解》一2.5 魔术揭秘——编译器和JVM

2.5 魔术揭秘--编译器和JVM Android游戏开发详解 在我们点击运行按钮和出现"Hello, world-?"之间,发生了什么事情.不管你是否相信,所有的事情都是在幕后进行的.当我们编写源代码的时候,Java编译器会编译它,这意味着,它会检查代码潜在的错误并将其转换为只有机器能够理解的语言.这个机器,就是执行代码并把想要的文本打印到控制台的Java虚拟机(Java Virtual Machine,JVM).如图2-18所示. JVM是一个虚拟的机器.它运行于操作系统之上,并且

《Android游戏开发详解》一2.2 设置开发机器

2.2 设置开发机器 Android游戏开发详解 在开始编写简单点的Java程序和构建令人兴奋的游戏之前,我们必须在自己的机器上安装一些软件.然而,这个过程有点枯燥且颇费时间,但是,为了让第一个程序开始运行,这些代价都是值得的. 2.2.1 安装Eclipse 我们将利用一个集成开发环境(Integrated Development Environment,IDE)来编写Java/Android应用程序.IDE是一种工具的名称,它能够帮助我们轻松地编写.构建和运行程序. 我们将要使用的IDE叫作

《Android游戏开发详解》——第2章,第2.2节设置开发机器

2.2 设置开发机器 Android游戏开发详解 在开始编写简单点的Java程序和构建令人兴奋的游戏之前,我们必须在自己的机器上安装一些软件.然而,这个过程有点枯燥且颇费时间,但是,为了让第一个程序开始运行,这些代价都是值得的. 2.2.1 安装Eclipse 我们将利用一个集成开发环境(Integrated Development Environment,IDE)来编写Java/Android应用程序.IDE是一种工具的名称,它能够帮助我们轻松地编写.构建和运行程序. 我们将要使用的IDE叫作

《Android游戏开发详解》——第1章,第1.7节控制流程第1部分——if和else语句

1.7 控制流程第1部分--if和else语句 Android游戏开发详解 我们现在把注意力转向控制流程(control flow ,也称为流程控制,flow control),这指的是代码行将要按照什么样的顺序执行.还记得代码执行的基本规则吧,它是说代码要从上到下地执行.在最简单的程序中,代码真的是按照线性方式从上向下执行的.然而,在任何有用的程序中,我们可能会看到,根据某些条件,会跳过一些代码行甚至重复执行一些代码行.让我们来看一些例子. 1.7.1 if-else语句块 if-else语句

《Android游戏开发详解》一1.7 控制流程第1部分——if和else语句

1.7 控制流程第1部分--if和else语句 Android游戏开发详解 我们现在把注意力转向控制流程(control flow ,也称为流程控制,flow control),这指的是代码行将要按照什么样的顺序执行.还记得代码执行的基本规则吧,它是说代码要从上到下地执行.在最简单的程序中,代码真的是按照线性方式从上向下执行的.然而,在任何有用的程序中,我们可能会看到,根据某些条件,会跳过一些代码行甚至重复执行一些代码行.让我们来看一些例子. 1.7.1 if-else语句块 if-else语句

《Android游戏开发详解》一1.2 数据类型

1.2 数据类型 Android游戏开发详解 1.2.1 基本类型 在前面的示例中,我们看到了数据类型(data type)的例子.例如,在程序清单1.1中,我们使用了整数值(integer value)5和6,这两个都是数值数据的例子.我们来看看其他的数据类型,先介绍其他的数值类型. 可以使用4种类型来表示整数(Integer),每种类型都用不同的大小.在Java中,我们有8位的byte.16位的short.32位的int和64位的long.4种类型中的每一种,都可以保存正的和负的整数值. 有

《Android游戏开发详解》一1.4 关于位的一切(位和字节的简单介绍)

1.4 关于位的一切(位和字节的简单介绍) Android游戏开发详解 在我们继续深入之前,值得先细致地介绍如何具体把值存储到变量中.我前面提到,不同的基本数据类型具有不同的位大小.例如,一个int有32位而一个long有64位.你可能会问,那么,到底什么是位? 位(bit)是一个二进制位的简称.换句话说,如果你有一个只有0和1的二进制数,每个数字就是1位.达到8位的时候,例如,(10101001),你就有了1字节. 对于位,你需要记住的一点是:拥有的位越多,所能表示的数值也越多.为了说明这一点