我正在调整用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没有很好的类权限。
建议表示赞赏。
答案 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)
基本上,这是全局数据或本地数据之间的选择。类变量(关键字static)存在于整个应用程序的一个位置。例如。您不能在同一个应用程序中同时运行两个参数化(尽管您可以并行或顺序运行两个应用程序)。使用实例化对象,您可以使用包含不同值的多个Parameter对象。
围绕这一点存在一些争议。教科书通常声明应使用访问器方法封装所有数据以保护对象内部状态。然而,正如你所说的效率略低,有些情况下直接访问成员变量被视为良好做法。
Java支持四种不同的方法和成员变量访问修饰符。