如果可以将字段声明为 public,那么 get/set 方法有什么意义?
What's the point of get/set method if you can declare the field as public?
我知道以前有人问过这个问题,但我还是不太明白。
人们说它是关于封装,以保护来自外部类的字段不被访问?但是,如果您使用 get/set 方法来更改和访问字段,那么保护字段有什么意义呢?
人们还说使用 get/set 方法,您可以灵活地向方法中添加更多逻辑。我同意,但是如果您的程序永远不需要这样的东西会怎样?在那种情况下,您是否仍然可以将字段声明为 public 而不是 get/set 方法?
据我了解,如果您将字段设置为 public,则同一台计算机上的其他程序 运行 可以访问和编辑未经检查的数据(如果我错了请纠正我)。然后程序可能会尝试将 String 对象存储到应该指向 Integer 的地址中,从而导致可能是安全漏洞的异常。
主要思想是,如果其他人将您的class用作更大程序的一部分,set 方法可以包括有效性检查和异常处理,以保护他们不必处理它。
示例:
private int value;
public void setNonNegativeValue(int newValue){
try{
if (newValue >= 0){
value = newValue;
}
} catch (Exception e){
//handle it here
}
}
现在显然这个方法不会导致需要异常处理,但你会看到更复杂的方法。
在这种情况下,值只能是正数,因为 setter 方法会对此进行检查。但是,如果值为 public,任何 class 都可以 myClass.value = -1;
如果您需要值为正数,这将是一个问题
首先,您不想通过调用 MyClass.name = x 来实现 property/field 在 200 class 中被使用
其次,您不想混淆 public 和 protected。不使用 setter 或 getter 将这两者混在一起是非常非常糟糕的,并且可能是最烦人但也是最愚蠢的错误。如果一个字段在抽象 class 中受到保护,然后您进入 Subclass.super.field 那么您将 运行 陷入许多问题。相反,你会想写 Subclass.getField()
最重要的是,它使代码的可读性提高了 10 倍。当人们有 contact.id = random.nextInt(10) 时,这太烦人了。现在猜猜是什么。您必须进入联系人 class 并查看 id 的用途,然后查看 id 的每次使用。
希望这可以帮助您理解
public
字段意味着每个人都可以访问和修改它们,但是拥有私有字段 并不 意味着你必须每次都声明它的 setter/getter可能取决于您的要求,因为假设有这样的字段您希望用户 get its value
但 not to change its value
。这是所有数据隐藏,具体取决于您的业务。
您不应将字段设置为 public
。这是 java 中的 encapsulation
。其他人不知道这些值是如何填充到私有变量中的,他们可能会从几个地方更改它,最后它变得一团糟。但是他们可以使用某种方法 public
。我没说Getters/Setters
.
至此为止 Getter/Setter
。如果您关注 java encapsulation
,请不要使用它。这与 public 变量相同(可能会添加更多逻辑,但用户可以使用 setter 更改它)。
你需要做的是,在同一个 class 中公开 public 方法,对实例变量做任何你想做的操作,return 只需要用户需要的结果需要知道。
例如:取 class CocaCola
。你写一个方法createCola()
。在里面你创造了可乐和 return 结果。用户不需要知道可乐的成分。如果您创建 Getter/Setter
或使成分 public 变得更糟。
这些只是专家建议的 java 中的标准或最佳方法。所以如果你不想关注,你不需要。
参考:
我知道以前有人问过这个问题,但我还是不太明白。
人们说它是关于封装,以保护来自外部类的字段不被访问?但是,如果您使用 get/set 方法来更改和访问字段,那么保护字段有什么意义呢?
人们还说使用 get/set 方法,您可以灵活地向方法中添加更多逻辑。我同意,但是如果您的程序永远不需要这样的东西会怎样?在那种情况下,您是否仍然可以将字段声明为 public 而不是 get/set 方法?
据我了解,如果您将字段设置为 public,则同一台计算机上的其他程序 运行 可以访问和编辑未经检查的数据(如果我错了请纠正我)。然后程序可能会尝试将 String 对象存储到应该指向 Integer 的地址中,从而导致可能是安全漏洞的异常。
主要思想是,如果其他人将您的class用作更大程序的一部分,set 方法可以包括有效性检查和异常处理,以保护他们不必处理它。
示例:
private int value;
public void setNonNegativeValue(int newValue){
try{
if (newValue >= 0){
value = newValue;
}
} catch (Exception e){
//handle it here
}
}
现在显然这个方法不会导致需要异常处理,但你会看到更复杂的方法。
在这种情况下,值只能是正数,因为 setter 方法会对此进行检查。但是,如果值为 public,任何 class 都可以 myClass.value = -1;
如果您需要值为正数,这将是一个问题
首先,您不想通过调用 MyClass.name = x 来实现 property/field 在 200 class 中被使用 其次,您不想混淆 public 和 protected。不使用 setter 或 getter 将这两者混在一起是非常非常糟糕的,并且可能是最烦人但也是最愚蠢的错误。如果一个字段在抽象 class 中受到保护,然后您进入 Subclass.super.field 那么您将 运行 陷入许多问题。相反,你会想写 Subclass.getField() 最重要的是,它使代码的可读性提高了 10 倍。当人们有 contact.id = random.nextInt(10) 时,这太烦人了。现在猜猜是什么。您必须进入联系人 class 并查看 id 的用途,然后查看 id 的每次使用。 希望这可以帮助您理解
public
字段意味着每个人都可以访问和修改它们,但是拥有私有字段 并不 意味着你必须每次都声明它的 setter/getter可能取决于您的要求,因为假设有这样的字段您希望用户 get its value
但 not to change its value
。这是所有数据隐藏,具体取决于您的业务。
您不应将字段设置为 public
。这是 java 中的 encapsulation
。其他人不知道这些值是如何填充到私有变量中的,他们可能会从几个地方更改它,最后它变得一团糟。但是他们可以使用某种方法 public
。我没说Getters/Setters
.
至此为止 Getter/Setter
。如果您关注 java encapsulation
,请不要使用它。这与 public 变量相同(可能会添加更多逻辑,但用户可以使用 setter 更改它)。
你需要做的是,在同一个 class 中公开 public 方法,对实例变量做任何你想做的操作,return 只需要用户需要的结果需要知道。
例如:取 class CocaCola
。你写一个方法createCola()
。在里面你创造了可乐和 return 结果。用户不需要知道可乐的成分。如果您创建 Getter/Setter
或使成分 public 变得更糟。
这些只是专家建议的 java 中的标准或最佳方法。所以如果你不想关注,你不需要。
参考: