Java中的访问器方法

Rya*_*man 4 java methods accessor

所以我对"setter"和"getter"方法有疑问,以及它们是否有用.

假设我只是写了一个非常基本的程序,如下所示:

    public class Account
    {
     String name;
     String address;
     double balance; 
    }
Run Code Online (Sandbox Code Playgroud)

然后,假设我编写另一个使用此"帐户"类的类,如下所示:

    class UseAccount
    {
        public static void main(String[] args)
        {
            Account myAccount = new Account();
            Account yourAccount = new Account();

            myAccount.name = "Blah blah"
        }        
    }
Run Code Online (Sandbox Code Playgroud)

等等

当我写作时myAccount.name = "Blah blah",我正在更改"帐户"类中变量"name"的值.我可以自由地按照我喜欢的方式执行此操作.但是,我注意到,最好将"帐户"类中的变量设为私有,然后使用"setter"和"getter"方法.所以,如果我写下面的内容:

    public class Account
    {
       private String name;
       private String address;
       private String balance;

       public void setName(String n)
       {
          name = n;
       }

       public String getName()
       {
          return name;
       }
    }
Run Code Online (Sandbox Code Playgroud)

我仍然可以通过创建另一个具有以下内容的类来更改变量"name"的值:

    class UseAccount
    {
       public static void main(String[] args)
       {
          Account myAccount = new Account();

          myAccount.setName("Blah blah");
       }
    }
Run Code Online (Sandbox Code Playgroud)

我不明白使用这种方法有什么不同或者应该阻止人们改变私有领域的价值.有帮助吗?

Boh*_*ian 7

使用简单的访问器方法,除了样式之外没有区别,但您也可以使用它们执行代码,例如:

public void setName(String name) {
    if (name == null) {
        throw new IllegalArgumentException("Name may not be null");
    }
    this.name = name;
}
Run Code Online (Sandbox Code Playgroud)

您还可以从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
}
Run Code Online (Sandbox Code Playgroud)

这些只是两个简单的例子,但是有关如何使用访问器方法的无限例子.

最好遵循一致的样式,这就是为什么我们总是使用getter/setter - 所以如果需要的话可以执行这样的代码.


Kum*_*tra 6

试试这个面向对象编程的黄金法则.

1.创建私有实例变量.

2.创建公共 getter和setter以访问这些Instance变量.

3,这种方法被称为封装.虽然Encapsulation可以以不同的方式使用,但这在设计模式中很重要,就像那些不断变化的行为必须封装在抽象类或接口中.

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 啊哈!之前有人评论过,当setter和getter方法中存在某种逻辑时,它们会更有效率,我现在明白你的意思了.只是为了确保我掌握这个概念:如果我正在编写视频游戏并且其中一个变量是"健康",我可以用`private int health = 500`初始化它.然后,如果有人试图通过将他们的健康状况设置为1000或其他东西来作弊,那么setter方法可能会有类似的东西:`if health> 500`然后等等等等等等不允许他们这样做. (2认同)