何时使用本地访问修饰符?

When to use a local access modifier?

在使用 intelliJ 时,有人建议我对方法进行本地化 - 通过删除访问修饰符。我意识到我真的不知道该使用哪个修饰符以及何时使用,希望得到一些说明。

我读了这个post:What is the difference between Public, Private, Protected, and Nothing?

因为那是针对 C# 的,虽然它们很相似,但我想确保它们没有太大的不同。

我还在此处阅读了 Javadoc post:https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

而且还是有点怀疑。

在此先致谢!

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

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 仅供 class 内部使用,因此用户没有理由看到它。这样他们就不需要知道金额是如何计算的,或者什么时候需要调用方法,或者它在内部设置了什么值。他们只是通过 getFuelNeeded();

轻松获得价值

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

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

当然,这会导致我们的 class 抛出除以零的 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;
}

这使我们能够检查用户给定的参数并确保我们的变量不会设置为某些无效值。