在示例中使用 setter 方法和简单地声明一个变量有什么区别?

What is the difference between using a setter method and simply declaring a variable in the example?

我只是想知道,使用 setter 方法 setLocationCells 和简单地声明一个名为 locationCells 且值为 {2,3 的 int 数组有什么区别,4}?

这里是使用setter方法的代码(第一个class是主要的class):

public static void main(String[] args) {

    SimpleDotCom dot = new SimpleDotCom();
    int[] locations = {2,3,4}; // these are the location cells we will pass in
    dot.setLocationCells(locations); // locationCells now 2,3,4
    String userGuess = "2";
    String result = dot.checkYourself(userGuess);

}

第二个class:

int[] locationCells;
int numOfHits = 0;

public void setLocationCells(int[] locs) {
    locationCells = locs;

}   


public String checkYourself(String stringGuess) {
    int guess = Integer.parseInt(stringGuess); 


    String result = "miss";
    for (int cell : locationCells) {
        if (guess == cell) {
            result = "hit";
            numOfHits++;
            break;
        }
    }

        if(numOfHits == locationCells.length) {
            result = "kill";
        }



    System.out.println(result);
    return result;
}

现在,没有 setter 方法:

public static void main(String[] args) {

    SimpleDotCom dot = new SimpleDotCom();
    String userGuess = "2";
    String result = dot.checkYourself(userGuess);

}

第二个class:

int[] locationCells = {2,3,4};
int numOfHits;

public String checkYourself(String stringGuess) {
    int guess = Integer.parseInt(stringGuess); 


    String result = "miss";
    for (int cell : locationCells) {
        if (guess == cell) {
            result = "hit";
            numOfHits++;
            break;
        }
    }

        if(numOfHits == locationCells.length) {
            result = "kill";
        }



    System.out.println(result);
    return result;
}

感谢任何帮助,非常感谢!

由于您可以通过多种方式分配对象成员,使用 getters 和 setters 有助于简化 Class 内部结构与与之一起工作的内部结构之间的契约它。这只需公开一个接口并通常将 Class 成员声明为私有即可。

如果您稍后更改这些成员的分配方式,提供数据验证、转换,您不必担心更改分配它们的每个其他地方,您只需更新 setter 或 getter。您的示例似乎微不足道,正确,但是 setters 和 getters 有助于随着项目的增长降低复杂性。当您使用接口时,它提供了一个更安全的契约,因为您可以处理除数据类型之外的各种微妙条件,例如当值为 0 或成员引用为 null 时状态应该是什么。

这里的设计原则叫做encapsulation