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

时间:2016-04-15 04:27:26

标签: java intellij-idea private public

在使用intelliJ时,我建议通过删除访问修饰符来使方法本地化。我意识到我真的不知道使用哪种修改器以及何时需要澄清。

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

和C#一样,虽然它们很相似,但我想确保它没有太大差异。

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

并且仍然有点怀疑。

先谢谢!

1 个答案:

答案 0 :(得分:3)

访问修饰符有助于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();

当然这会导致我们的类为divis抛出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;
}

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