【问题标题】:Why Can I Access Private Variable From Outside Class?为什么我可以从外部类访问私有变量?
【发布时间】:2020-04-20 05:13:13
【问题描述】:

我的任务是找出如何查看但不编辑来自另一个类的私有 int。我尝试了一些过于复杂的事情,但有效的是:

public int getC() { 
return myC; 
 }

myC 是一个私有整数。让另一个类访问私有变量真的这么容易吗?我以为他们不能分享。有人可以解释为什么允许这样做吗?谢谢。

【问题讨论】:

  • 不,你不能,你是通过 getter 提供访问权限,这是一个很好的做法,因为如果那个外部类可以直接访问 myC,你就会被它困住,你的班级必须拥有 if for life否则您将破坏其他代码,您也可以对要分配给该变量的内容进行任何验证,但是如果您明天使用 getter() 可以使其返回其他内容,也可以输入验证代码
  • 明确地说,通过反射绕过private真的很容易。这是简单的封装,您返回myC,但可以(如果要求更改)return d,其中d 是其他int。但即便如此,通过反射,有人可以访问您的 private 字段。所以没有strong保证某人不能访问private字段。

标签: java private


【解决方案1】:

您创建了一个 public getter 函数来访问私有变量。因此,如果另一个类将您的类的实例作为其局部变量,它可以使用 public 函数(getter)来访问您原始类的 private 变量。

【讨论】:

  • 那么使用公共方法来共享私有变量与仅创建公共变量几乎相同吗?太好了
【解决方案2】:

公开私有字段的唯一方法是通过accessors aka getters

但你应该遵循两条规则:

  • 避免通过 getter(ide 快捷方式)直接公开所有私有字段的诱惑。仅在确实需要时添加它们。

  • 如果您公开的类型不是不可变的,请通过返回防御副本来处理不是escape references

示例:

private Date date;
public Date date() {
   return date;
}

这段代码破坏了封装,和这样做是一样的。

public Date date;

要解决这个问题,您有 2 个解决方案

  • 返回你约会对象的防御性副本
public Date date() {
   return new Date(date.getTime());
}
  • 使用不可变版本的 Date -> LocalDate

同样的逻辑适用于集合类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    • 2010-10-03
    相关资源
    最近更新 更多