【问题标题】:What is the rationale for using per-method/field access specification?使用按方法/字段访问规范的基本原理是什么?
【发布时间】:2015-09-29 22:25:57
【问题描述】:

在 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;

【问题讨论】:

  • 其实在Javainterfaces中,与C++头文件比较接近的首选约定是省略访问修饰符(默认为public)。
  • C++ 组织访问说明符的基本原理是什么?

标签: java design-rationale


【解决方案1】:

比较:

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>
    }

如果你像这样“排除”访问说明符,事情很快就会变得非常糟糕。是的,缩进有帮助。是的,你有 Ctrl-F。但是仍然可能有很多大量需要查看(例如,数千行文件),并且为了寻找那种东西而不得不将注意力从任务上移开无助于提高生产力。

Java 和 C++ Java 以不同的方式处理它。 Java 将访问说明符保留在本地,因此了解您正在使用的方法足以确定范围。 C++ 将声明填充在一起,因此可以“分解”访问说明符。实现方法的时候可能没那么好,但是在头文件中更简洁,而且可能也更容易理解。

【讨论】:

  • 可能是这样,但我想看看这背后的原始 oracle/java 基本原理(这就是问题所在)。
  • 嗯...我不认为 Java 设计过程的许多第一方资源都在流传,所以缺少 James Gosling/Sun 的某个人在这里回答我想大多数答案是某种猜测
  • 嗯。我想知道外面有多少。不引入类似于 C++ 的“auto”类型推断关键字的特性是一个很好的理由。
  • 是的,Brian Goetz 写了几篇关于 Java 8 流/lambdas 设计决策的精彩文章。我想如果有人建议将捆绑访问说明符作为 JSR,您会发现更好的推理,但我不确定是否有人会在现阶段尝试更改语言的这样一个基本部分
  • @Dici 我看到了this。可能还有更多。
【解决方案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...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-26
    • 2020-10-24
    • 1970-01-01
    • 2019-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多