【问题标题】:When to use a local access modifier? [duplicate]何时使用本地访问修饰符? [复制]
【发布时间】:2016-04-15 04:27:26
【问题描述】:

在 intelliJ 中工作时,建议我将方法本地化 - 通过删除访问修饰符。我意识到我真的不知道该使用哪个修饰符以及何时使用并且想要澄清一下。

我读了这篇文章:What is the difference between Public, Private, Protected, and Nothing?

对于 C# 来说,虽然它们很相似,但我想确保它不会太不同。

我还在这里阅读了 Javadoc 帖子:https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

还是有点怀疑。

提前致谢!

【问题讨论】:

  • 尽可能使用私有。仅当您明确设计继承时才使用受保护的。 Nothing (package) 允许同一个包中的其他类调用该方法,但不允许不同包中的类调用该方法。当然,Public 允许任何人调用它。谨慎使用 public。
  • @neferpitou 这实际上只是link 的图表副本。我很好奇是否有更好的方法来解释它。
  • 谢谢,@KevinO 这有助于我澄清它。这是否意味着可以从主类或其他类中轻松修改公共方法?
  • @Infinitylsx,我不确定您所说的修改方法是什么意思。一个方法可以在子类中被覆盖,但是公共、受保护或(在某些情况下)包方法可能会发生这种情况。避免公开的原因是它创建了一个必须维护的合同。旁注,final 方法不能被覆盖。
  • 要决定一个方法应该是public 还是private:首先,你需要考虑你的类代表什么。假设您有一个类X,并且代码的其他部分有一个类X 的对象。其他代码应该能够用你的X 做什么样的事情?这些是您想在X 中公开的方法。您在X 中编写的任何其他方法都将是“帮助”方法,仅用于帮助其中一种公共方法工作。这是一个过于简单化的解释,不能解释 protected 或“默认”,但这是您需要开始的地方。

标签: java intellij-idea private public


【解决方案1】:

访问修饰符有助于 OOP 的封装原则。如果您创建了一个编写良好的类,任何人都可以使用它,而无需了解其工作原理的所有内部细节。当您将方法定义为公共时,任何使用您的类的代码都可以访问该方法。您只想公开类的最终用户需要的方法。如果它是一个仅在您的类内部进行一些内部计算的辅助方法,请将其声明为私有。它将减少最终用户可用的方法,并使您的课程更易于使用。这是一个例子:

Public Class Car {
    private int speed;
    private float fuelNeeded;
    private float afRatio = 14.7;

    public void speedUp { speed++; }

    public void speedDown { speed--; }

    public float getFuelNeeded {
        calculateFuelNeeded(speed);
        return fuelNeeded;
    }

    private void calculateFuelNeeded (int speed) {
        // Do some complex calculation
        fuelNeeded = someValue / afRatio;
    }
}

任何创建 Car 对象的人都可以使用三种方法,speedUp、speedDown 和 getFuelNeeded。 calculateFuelNeeded 仅由类内部使用,因此用户没有理由看到它。这样他们就不需要知道金额是如何计算的,或者何时需要调用该方法,或者它在内部设置了什么值。他们只是通过 getFuelNeeded() 轻松获得价值;

在声明变量时,通常将它们声明为私有的总是正确的,对于需要从类外部访问的任何变量都有一个公共的 get() 和 set() 方法。这样做的主要原因是防止外部用户将值设置为无效。在我们的 Car 类中,afRatio 必须是非零的,因为我们使用它作为除数。如果我们将其声明为公开,用户可以轻松编写以下代码:

Car car = new Car();
car.afRatio = 0;
someFloat = car.getFuelNeeded();

当然,这会导致我们的类抛出一个 ArithmeticException 用于除以零。但是,如果我们这样做:

private afRatio = 14.7;

public void setAfRatio(float ratio) {
    if(ratio <= 0)
        throw new IllegalArgumentException("A/F ratio must be greater than zero");
    afRatio = ratio;
}

这允许我们检查用户给定的参数并确保我们的变量不会被设置为一些无效值。

【讨论】:

    猜你喜欢
    • 2016-07-18
    • 2017-08-11
    • 2016-11-20
    • 2014-11-03
    • 2020-02-05
    • 2019-04-14
    • 2016-07-26
    • 2017-08-18
    • 2013-05-25
    相关资源
    最近更新 更多