这是在同一个类的函数中使用私有变量的正确方法吗?

时间:2017-02-19 10:50:33

标签: java

我正在创建一个计算对象密度的程序,我正在使用2个独立的java文件,即Density类和主类。我将所有需要的数据声明为私有,并在几个函数中使用它,这些函数将嵌套在将在主类中调用的函数中,我的问题是我不确定这是否是使用私有变量的正确方法使用getter和setter。 (该程序已成功编译) 下面是一些部分Density.java:

class Density{

Scanner DataDensity = new Scanner(System.in);  // use this scanner for Density class
private double Mass;
private double Volume;
private double Density;

// Calculates Density
public void CalculateDense(){
    System.out.println("Mass (Kg) : ");
    Mass = DataDensity.nextDouble();
    System.out.println("Volume (m^3) : ");
    Volume = DataDensity.nextDouble();
    Density = Mass/Volume;
    System.out.println("Density : "+Density+"Kg/m^3\n");
}
// And another calculating functions.
// This function below will be the only function used in the main class
public void getDataDense(){
    char Input;
    System.out.println("p : density\nm : mass\nv : volume\nq : back to main menu\n");
    boolean Iteration = true;
    while(Iteration){
        System.out.println("Your Choice : ");
        Input = DataDensity.next().charAt(0);
        if(Input=='p'){
            // call "CalculateDense" here.
            CalculateDense();
        }
        else{
        System.out.println("Your choice is not available\n");
        }
    }
}

以下是主要课程的一些部分:

public static void main(String[] args){
while(Continue){
 System.out.println("Enter one of the number on the menu : ");
 int MainChoice = MainInput.nextInt();
     if(MainChoice==1){
        // Density,Mass,Volume (Density.java)
        Density DensityOb = new Density();
        DensityOb.getDataDense();
    }
    else{
      // some statements
   }
}

任何答案都将不胜感激

3 个答案:

答案 0 :(得分:0)

是的,这是一种正确的方式。这是封装。 CalculateDense也可以是私有的。

答案 1 :(得分:0)

将属性设置为私有可以保证它们的安全,但是您并不真正需要类中的所有这些属性,如果一个属性(其他属性所依赖的属性)发生更改,则不应在没有明确状态更改的情况下从其他属性计算属性如果没有触发更改逻辑,您的数据就会不一致,这就是我的观点。

在对象内部使用扫描仪的另一件事情并不好,例如,如果你想改变就绪方式(来自文件),至少如果你真的需要读取对象中方法内的数据,你可以通过扫描仪在构造函数或方法中,您可以阅读有关依赖注入的更多信息。

请注意约定,属性是camelcase。

答案 2 :(得分:0)

只要程序使用一个线程运行就没问题。如果多个threads使用相同的object,您可能会遇到问题。例如。你在课堂上有两种方法:

  • CalculateDense
  • getDataDense

现在,想象一下两个线程正在使用同一个对象的场景。一个线程调用CalculateDense,而另一个线程同时调用getDataDense。由于CalculateDense仍在执行,您将在第二个帖子中获得exception或不一致的结果。

理想的做法是创建一个immutanle对象(例如,接受MassVolumeDensity并使CalculateDense返回一个数字,而不是初始化参考变量)。另一种做法是在方法执行完成后在本地创建Scannerclose

您可以阅读有关线程here的更多信息。