数据库访问的数据封装:我总是必须写 public + 私有方法吗?

Data encapsulation for db access: Do I always have to write public + private methods?

我的一个同事说这是数据封装,使用数据库访问时必须这样做:

public String foo(final int x) {
  return fooHidden(x);
}

private String fooHidden(final int x) {
  return db.lookFor(x);
}

我简化了代码以提高可读性,但它仍然是相同的结构。 所以在我看来这不是数据封装,它没有隐藏任何东西,因为return值和传递参数是相等的。所以对我来说,写没有什么区别:

public String fooHidden(final int x) {
  return db.lookFor(x);
}

如果我们覆盖方法或为使用 class 内部属性的私有方法设置其他参数,上面的解决方案对我来说是有意义的,但事实并非如此。

你能告诉我谁是对的吗?对于这种情况,您将如何完成真正的数据封装?

这两种方法的实现完全相同,即在您的情况下没有区别,但从语义上讲,更有意义的是:

public String foo(final int x) {
  return db.lookFor(x);
}

请注意名称 foo 而不是 fooHidden 以引用 public 仅提供的方法(隐藏 否则会暗示您正在公开应该是私有的 方法)。

同时,这两个实现仍然隐藏 db 字段,该字段应该 对 class 调用者隐藏并且 private 到包装 class,因此 封装所以封装是关于字段状态而不是方法实现

这意味着class结构整体应该是这样的:

public class MyClass {

  private db; // must be private, otherwise you'll be violating the encapsulation rule

  public String foo(final int x) {
    return db.lookFor(x);
  }

}

回到 OP 问题:

Do I always have to write public methods + private methods?

问题应该是:Do I always have to write public + private fields ?

我要说的是,在重大情况下,你应该这样做。 同时,可能还有一些设计需求需要打破常规。

封装,在Java中,就是关于Access Modifiers;意思是 字段/方法 您使 public 可以被外界访问。

这是 what Martin Fowler states about Access Modifiers:

Object-oriented languages divide a program into modules called classes. Each class contains features, which consist of data (fields) and methods. (Not all languages use these terms, but they'll do for this.) Languages have various rules about what other classes can access the features of a class, these are often based on access modifiers that apply to a class.