0

我正在调整用 Java 编写的模拟。我有限的背景都是C++。

模拟的当前实现依赖于一个名为Parameters. 类的实例Simulation引用 的属性Parameters,我认为它从未被实例化。该类Parameters具有类似的结构

public class Parameters {
  public static int day = 0;
  public static final int endDay = 365;
  ....
  public static int getDate() {
    return day;
  }
}

在 的一个实例中Simulation,有对例如 的引用Parameters.day

目前, 的所有属性Parameters都是硬编码的。我需要能够使用命令行参数更改其中的一些。例如,我希望能够endDay使用Parameters::setEndDay(int customDay)某种函数来设置不同的值。

我的第一个想法是创建一个实例 ( Parameters parameters = new Parameters()) 并完全重写Parameters该类,使其所有属性都是私有的,并且只能通过访问器函数访问。我担心这种方法效率不高。到目前为止,我已经尝试了一种混合方法,在该方法中我创建了一个Parameters类的实例,然后我将它传递给一个实例,Simulation同时仍然偶尔引用Parameters.day(我不需要更改)。

问题之一是我对 Java 中的类权限没有很好的认识。

建议表示赞赏。

4

3 回答 3

1

Simulation如果你让它们都不是最终的,那么你可以在实例化类之前直接从你的命令行参数中设置它们:

// read command-line arguments

Parameters.endDay = 123; // this will change all reference to Parameters.endDay
new Simulation(...)
于 2012-04-21T19:04:34.883 回答
1

setEndDay(int customDay)Parameters类中创建静态方法。而且您可以在不使用 class not object: 的情况下更改值Parameter.setEndDay(10)。请注意,endDay变量应该是非最终的。

于 2012-04-21T19:06:15.477 回答
1

访问静态成员变量与实例化对象

本质上,这是在全局数据或本地数据之间进行选择。一个类变量(关键字静态)存在于您的整个应用程序的一个地方。例如,您不能在同一个应用程序中同时运行两个参数化(尽管您可以并行或顺序运行两个应用程序)。使用实例化对象,您可以拥有多个包含不同值的 Parameter 对象。

访问器方法与可访问的成员变量

There are some controversy around this. Schoolbooks usually state that all data should be encapsulated using accessor methods to protect the objects internal state. It is however as you state slightly less efficient and there are cases where making member variables directly accessible is considered good practice.

Java Access Modifiers

Java supports four different access modifiers for methods and member variables.

  • Private. Only accessible from within the class itself.
  • Protected. Can be accessed from the same package and a subclass existing in any package.
  • Default (no keyword). Only accessible by classes from the same package.
  • Public. Accessible from all classes.
于 2012-04-21T19:21:02.253 回答