使用每个方法/字段访问规范的基本原理是什么?

时间:2015-09-29 22:25:58

标签: java design-rationale

在C ++中,字段或方法的访问说明符基于其在先前声明的第一个访问规范下的位置:

public:
  int my_public_variable;
private:
  void secretPrivateOperations();
  int internal_counter;

通过在每个方法/字段之前添加访问说明符来指定访问权限的Java背后的设计原理是什么?

public int my_public_variable;
private void secretPrivateOperations();
private int internal_counter;

2 个答案:

答案 0 :(得分:2)

比较

public:
    T a();
    T b();
    ...
    T z();

public:
    T a() {
        <lots of code>
    }
    T b() {
        <lots of code>
    }
protected:
    T c() {
        <more code>
    }
public:
    T d() {
        <more code>
    }

如果你&#34;因素&#34;像这样的访问说明符,事情可以很快变得非常讨厌。是的,缩进有帮助。是的,你有Ctrl-F。但是仍然可以看到很多的噪音(例如,数千行文件),并且不得不放下你的想法只是为了寻找那种可能不会#39; t帮助提高工作效率。

Java和C ++ Java以不同的方式处理它。 Java将访问说明符保持在本地,因此了解您正在使用的方法就足以确定范围。 C ++将声明组合在一起,因此访问说明符可以被排除在外&#34;。它在实现方法时可能不太好,但它在头文件中更简洁,也可能更容易理解。

答案 1 :(得分:2)

要添加 awksp 回答,请考虑一个简短示例。通常,您使用您不想公开的私有方法实现公共API方法。您经常希望这些方法的代码彼此接近,以使代码更易于阅读,如果您不这样做,请查看它的外观:

public:
    void api1() { 
        do_some_stuff();
        private_method();
        some_other_stuff();
    }

   void api2() {
        do_something();
   }

   int api3() {
        int i = a_computation();
        return i + A_CONSTANT;
   }

private:    
   void private_method() {
        do_clever_stuff();
        api1_implementation_details();
   }

这不是很好看,private_method远不是使用它的唯一方法,api1。代码的公共/私有划分没有任何逻辑意义。 您希望您的代码按其逻辑进行组织,而不是通过方法的可见性进行组织。

我非常希望看到这个:

// I can read the whole logic of this method without any clutter
public void api1() { 
   do_some_stuff();
   private_method();
   some_other_stuff();
}

private void private_method() {
   do_clever_stuff();
   api1_implementation_details();
}
// and so on...