Java中的访问器方法
所以我有一个关于“setter”和“getter”方法的问题,以及它们是否有用 假设我只编写了一个非常基本的程序,如下所示:Java中的访问器方法,java,methods,accessor,Java,Methods,Accessor,所以我有一个关于“setter”和“getter”方法的问题,以及它们是否有用 假设我只编写了一个非常基本的程序,如下所示: public class Account { String name; String address; double balance; } class UseAccount { public static void main(String[] args) {
public class Account
{
String name;
String address;
double balance;
}
class UseAccount
{
public static void main(String[] args)
{
Account myAccount = new Account();
Account yourAccount = new Account();
myAccount.name = "Blah blah"
}
}
public class Account
{
private String name;
private String address;
private String balance;
public void setName(String n)
{
name = n;
}
public String getName()
{
return name;
}
}
然后,假设我编写了另一个使用这个“Account”类的类,如下所示:
public class Account
{
String name;
String address;
double balance;
}
class UseAccount
{
public static void main(String[] args)
{
Account myAccount = new Account();
Account yourAccount = new Account();
myAccount.name = "Blah blah"
}
}
public class Account
{
private String name;
private String address;
private String balance;
public void setName(String n)
{
name = n;
}
public String getName()
{
return name;
}
}
等等等等
当我写myAccount.name=“Blah Blah”
时,我正在更改“Account”类中变量“name”的值。我可以自由地按照我喜欢的方式编写代码,多次这样做。然而,我注意到,更好的做法是将“Account”类中的变量设置为私有,然后使用“setter”和“getter”方法。因此,如果我写下以下内容:
public class Account
{
String name;
String address;
double balance;
}
class UseAccount
{
public static void main(String[] args)
{
Account myAccount = new Account();
Account yourAccount = new Account();
myAccount.name = "Blah blah"
}
}
public class Account
{
private String name;
private String address;
private String balance;
public void setName(String n)
{
name = n;
}
public String getName()
{
return name;
}
}
我仍然可以通过创建另一个类来更改变量“name”的值,该类具有以下内容:
class UseAccount
{
public static void main(String[] args)
{
Account myAccount = new Account();
myAccount.setName("Blah blah");
}
}
我不明白使用这个方法有什么不同,或者应该防止人们更改私有字段的值。有什么帮助吗?对于普通的访问器方法,除了样式之外没有什么区别,但您也可以使用它们执行代码,例如:
public void setName(String name) {
if (name == null) {
throw new IllegalArgumentException("Name may not be null");
}
this.name = name;
}
您还可以从getter返回副本,从而保护您的数据:
private List<String> middleNames;
public List<String> getMiddleNames() {
return new ArrayList<String>(middleNames); // return a copy
// The caller can modify the returned list without affecting your data
}
私有列表中间名;
公共列表getMiddleNames(){
返回新的ArrayList(middleNames);//返回一个副本
//调用者可以修改返回的列表而不影响您的数据
}
这只是两个简单的例子,但关于如何使用访问器方法,还有无数的例子
最好遵循一致的风格,这就是为什么我们总是使用getter/setter,所以如果需要的话,可以执行类似的代码。事实上,它不会阻止,并且在更改getter/setter方法的访问修饰符或向其中添加额外的逻辑之前没有区别。后者并不总是一个好主意,但有时会有所帮助,例如更新名称会强制更新某些缓存值或执行一些检查。使用getter/setter是一种很好的实践,在POJO和JavaBeans等几种方法中都有使用,但是如果您不打算将自定义逻辑添加到getter/setter中,也不打算使用这些方法,那么您将对使用直接访问字段感到满意
有一件事我想提一提。使用getter/setter,您可以提供在运行时计算的字段,这些字段在对象中不持久存在。例如,您的
帐户
类的对象保存出生日期,您需要获取它的年龄。使用setters和getter的优点是,您可以包含延迟初始化、验证等规则。此外,如果您需要实现Java Beans投诉代码,您需要遵循这些规则
如果您的代码从未更改,那么您是对的-没有区别 然而,代码变化很大。如果您需要跟踪谁修改了他们的姓名,会发生什么情况 您需要在Account类中有一个布尔值,每当name字段发生更改时,该布尔值就会变为true 因此,现在您必须检查每个源文件并放置一个
myAccount.nameChanged=true'
在每个
myAccount.name=无论什么代码>
因此,您开始有代码重复,出现错误的可能性增加。如果我错过了改名怎么办
最好的方法是将成员变量分类为private
您的setName代码如下所示:
public void setName(String newName)
{
name = newName;
nameChanged = true;
}
你不必担心虫子 您总是可以在不使用getter和setter方法的情况下开发应用程序。正如您所解释的。但是使用getter和setter是更好的做法,因为访问修饰符private/public为您提供了封装,这是OOPS特性。
您可以随时编写程序,而无需使用OOPS功能,如封装、抽象、,继承…但是如果您编写大型应用程序而不使用,您将很难维护这些功能,并且很快就会意识到这些功能的重要性。当您声明一些私有实例变量并声明公共getter
和setter方法来访问和更改实例变量值
如果您使用这些getter和setter方法来访问/设置实例变量,那么它保证如果开发人员更改实例变量名称,您的程序不会失败
例如,在当前版本中,您使用name、address、balance实例变量,并且在访问它们时不使用getter和setter方法,如myAccount.setName(“Blah Blah”)
但如果下一个版本的开发者将实例变量名从name
更改为userName
,在这种情况下,用户程序将中断,但如果您使用getter和setter,它将不会中断,因为开发者不会更改getter和setter方法名(根据OOPS基本原理).试试这个面向对象编程的黄金法则
1。创建private实例变量
2.创建publicgetter和setter以访问这些实例变量
3.这种方法称为封装。虽然封装可以在不同的中使用
在设计模式中具有重要意义的方式,就像那些不断变化的行为一样
可以封装在抽象类或接口中
4.现在回到Getter和Setter的话题
Getter和Setter帮助验证实例变量的输入
例如:
假设我有一个方法来分配狗的年龄,现在年龄不能为负,如果我没有setter方法,那么我将无法验证年龄的输入
private int age;
public void setDogAge(int age){
if (age>0){
this.age = age;
}
else{
System.out.println("Please Enter a Valid Age");
}
}
每个帐户前面的java关键字“private”
类的字段声明,p