gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 08:26:09 26 4
gpt4 key购买 nike

我正在阅读一些关于 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com