安全有效的方法来适应静态类的修改

时间:2012-04-21 19:01:14

标签: java

我正在调整用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没有很好的类权限。

建议表示赞赏。

3 个答案:

答案 0 :(得分:1)

如果你使所有这些都是非final的,那么你可以在实例化Simulation类之前直接从命令行参数设置它们:

// read command-line arguments

Parameters.endDay = 123; // this will change all reference to Parameters.endDay
new Simulation(...)

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

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

围绕这一点存在一些争议。教科书通常声明应使用访问器方法封装所有数据以保护对象内部状态。然而,正如你所说的效率略低,有些情况下直接访问成员变量被视为良好做法。

Java Access Modifiers

Java支持四种不同的方法和成员变量访问修饰符。

  • 私人即可。只能从班级内部访问。
  • 受保护的即可。可以从相同的和任何中存在的子类访问。
  • 默认(无关键字)。只能通过同一包中的类访问
  • 公开即可。所有课程都可以访问。