有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如果我们可以使用访问器访问私有数据成员,那么为什么我们不能访问私有方法呢?

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

 private int num=5;

 public int get_num()
 {
  return num;
 }

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

同样的,我们不能创建一个返回私有方法的访问器方法吗? 我只是想了一下,如果我们做不到,请解释。谢谢!


共 (3) 个答案

  1. # 1 楼答案

    TL;DR

    访问私有方法违反了encapsulation的基本面向对象原则。问题不是“我们能访问私有方法吗?”但是“我们应该这样做吗?”。它违背了信息隐藏的原则,也违反了物品“提供”给消费者的合同。强制您这样做的对象或类应被视为设计不当

    为什么不应该访问私人成员

    首先,类应该实现域逻辑的一部分,该部分关系非常密切,几乎不需要与外部世界进行交互来履行其职责(这称为高内聚)。然后为类/对象定义一个公共接口,该接口具有向外界公开的功能——对象的使用者只能使用该接口(这称为松耦合)

    私有方法可以被看作是以更好的可读性在类内部构造代码的一种方式——它们不打算与外部世界共享。把它们看作是一个“安全空间”,让开发人员在不违反合同的情况下随意改变。这就是为什么如果你真的访问私有方法会产生不良副作用的原因:你的代码很可能会破坏它,因为类的开发人员决定改变这种方法的实现Effective Java, Chapter 4, Item 13protected成员解释了这一点:

    For members of public classes, a huge increase in accessibility occurs when the access level goes from package-private to protected. A protected member is part of the class's exported API and must be supported forever. Also, a protected member of an exported class represents a public commitment to an implementation detail.

    例外情况

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

  2. # 2 楼答案

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

    访问修饰符可以帮助您实现适当的抽象。因此,任何标记为private的内容都只能在类中直接访问。但如果你想让外界的人读/写它的值,你可以通过getter/setter来公开它。类似地,私有方法也不能在类之外访问。但是没有人阻止你创建只调用这个私有方法的公共方法。通过这种方式,您可以实现对私有方法的访问。但这将是一个非常糟糕的设计

  3. # 3 楼答案

    您可以通过公共方法访问私有方法。这有时用于包装复杂的私有方法,并公开更简单的公共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