Java中的访问器方法

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) {

所以我有一个关于“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;
       }
    }
然后,假设我编写了另一个使用这个“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