如果我们可以使用Accessors访问私有数据成员,那么我们无法访问私有方法?

时间:2016-12-31 16:04:54

标签: java private private-members

我们可以使用访问者方法访问私有数据成员,例如

 private int num=5;

 public int get_num()
 {
  return num;
 }

我们可以从任何类访问返回的值,即使num是私有数据成员。

所以在类似的说明上我们不能创建返回私有方法的访问器方法吗? 我只是想一想,如果我们不能这样做请解释。谢谢你

4 个答案:

答案 0 :(得分:3)

重构代码时会创建私有方法。它们是实施细节,没有人需要知道。它们在公共方法中使用,它们应该提供您想要提供给客户端的功能(每个公共方法都可以称为其他类(即其客户端)使用/使用的API。)

提供访问修饰符以帮助您实现正确的抽象。所以任何标记为私人的东西都只能在你的班级内直接访但是如果你想让外面的人读/写它的值,你可以通过getter / setter公开它。类似地,私有方法在类外是不可访问的。但没有人阻止你创建只调用这个私有方法的公共方法。这样您就可以实现对私有方法的访问。但这将是一个非常糟糕的设计。

答案 1 :(得分:2)

您可以通过公共方法访问私有方法。这有时用于包装复杂的私有方法并公开更简单的公共API。

class Delegator {

    private void doPrivateStuff(int param) { ... }

    public void doStuffOnce() {
        doPrivateStuff(1);
    }

    public void doStuffIfConditionIsMet() {
        if(condition) {
            doPrivateStuff(1);
        }
    }
}

您还可以使用反射访问私有方法。 http://tutorials.jenkov.com/java-reflection/private-fields-and-methods.html

答案 2 :(得分:1)

因为访问者是公共的,所以可以从课外访问;即使它返回私人数据。

返回数据的访问修饰符并不相关,只有方法的访问修饰符才重要。

如果您创建了一个返回对私有方法的引用的公共方法,那么您可以从类外部调用私有方法。但这完全违背了将该方法设为私有的目的。

你我想知道"为什么公开吸引私人变量"。答案是虽然可以检索私人数据,但是更改是不可能的(除非您也创建公共设置者)公共数据。这假设私人日子是不可变的。如果它是可变的,则重新引用对私有数据的引用会抵消将变量设置为私有的任何保护。

答案 3 :(得分:1)

<强> TL; DR

访问私有方法违反了encapsulation的基本面向对象原则。问题不是“我们可以访问私人方法吗?”但“我们应该这样做吗?”它与信息隐藏原则相矛盾,它打破了对象向消费者“提供”的契约。强制执行此操作的对象或类应被视为设计不佳。

为什么您不应该访问私人会员

首先,一个类应该实现你的域逻辑的一部分,这个逻辑是如此密切相关,以至于外部世界几乎没有必要的交互来履行其职责(这称为高内聚)。然后,您可以使用向外部世界公开的功能为您的类/对象定义公共接口 - 对象的使用者必须只使用此接口(这称为松散耦合)。

私有方法可以被视为一种以更易读的方式在您的类中构建代码的方法 - 它们不打算与外部世界共享。将它们视为类的开发人员在不违反合同的情况下进行任意更改的“安全空间”。这就是为什么如果您实际访问私有方法可能会产生不良副作用的原因:您的代码可能会破坏它,类的开发人员决定更改此类方法的实现。 Effective Java, Chapter 4, Item 13protected成员解释了这一点:

  

对于公共类的成员,当访问级别从package-private变为protected时,可访问性会大大增加。受保护的成员是类的导出API的一部分,必须永久支持。此外,导出类的受保护成员表示对实现细节的公开承诺。

<强>例外

我从“不访问对象之外的私有成员”规则中知道的唯一例外是在测试中,当您要么重置某个变量(例如Singleton)或者想要促进复杂逻辑的测试时通过测试实现的私有部分,从而降低测试的复杂性。