java - OOP:在同一个类中调用公共(public)方法

标签 java oop methods encapsulation public

我正在阅读一些关于 collision avoidance systems 的文章在汽车中,当我的程序员思维引导我以面向对象的方式思考这个概念时,这让我怀疑这些系统是否尊重面向对象的编程模型。

作为主要的 Java 开发人员,我将这个问题转移到 Java 环境中,它提出了一个特定的问题:在同一个类中(在非静态上下文中)调用公共(public)方法是否尊重并遵循面向对象的方式?

我的意思是,以这个简短的假设汽车类为例:

public class Car {
    // Class attributes.

    // Constructors.

    public void accelerate(final double amplitude) {
        // Accelerate according to the amplitude.
    }

    public void brake(final double amplitude) {
        // Brake according to the amplitude.
    }

    // Other useful methods.

    private void collisionPreventionActions() {
        // Some actions.

        brake(100.0);

        // Some other actions.
    }
}

假设某个线程负责检测碰撞并在检测到碰撞时采取行动,其中一个行动就是刹车。显然 brake(...) 方法成为一个有趣的选择,但这不会打破面向对象的做事方式吗?但这不仅仅是刹车。如果本类(class)中的防撞系统改用方向盘来避免事故会怎样?从内部角度来看,我觉得汽车会使用自己的输入很奇怪......

在更一般的范围内,假设您有一个通用对象,我喜欢将其视为一个黑盒子。公共(public)方法相当于黑匣子上控制其行为的杠杆。在此对象中调用公共(public)方法意味着黑匣子将从其内部机制激活其自身的杠杆。

我问是因为我知道这样做在 Java 中是合法的,而且我在生活中多次看到在同一个类中调用公共(public)方法,但合法并不一定意味着它是正确的 OO这样做的方式。

在非静态上下文中的同一个类中使用公共(public)方法是否遵循面向对象编程和封装的规则?如果不是,正确的做法是什么或解决方法是什么?

最佳答案

从 OOP 的角度来看,这种选择没有任何问题:一个方法执行需要其他方法组合的事情是完全没问题的。

不过,在实践中,一种常见的方法是将功能分为公共(public)部分和私有(private)部分,如下所示:

public void brake(final double amplitude) {
    // check preconditions
    if (speed == 0) throw new IllegalStateException("cannot brake when standing");
    if (amplitude <= 0) throw new IllegalArgumentException("amplitude must be positive");
    // ... do other important checks
    doBrake(amplitude);
}
private void doBrake(final double amplitude) {
    // The real code goes here
}

现在您的 collisionPreventionActions可以调用doBrake而不是 brake ,假设您在调用电话之前已经检查了所有必要的先决条件。

备注:doBrake也应该检查它的先决条件。但是,它可以使用断言,而不是在不满足先决条件时抛出异常。不同之处在于,异常表示其他人滥用您的公共(public)方法,而断言表示您或维护您的代码的其他人滥用您的封装方法。

关于java - OOP:在同一个类中调用公共(public)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25794066/

相关文章:

java - 静态方法的使用

c# - 代码优化: Create a method for recurring procedures

java - 方法和垃圾收集

java - 对文件中的多个数组进行排序。整理各州人口

c++ - 通过 const 引用传递对象与传递无名对象

c# - 使用{设置;得到;}而不是{得到;放;}

javascript - 我怎样才能减少这个功能的样板文件?

java - 如何返回列表中的最后一个通用对象? java

java - 寻找 lex/yacc 格式的 Java 语法

java - 如何从 double[] 形成 java.util.List<java.lang.Double>