我是一名编程爱好者,想要制作一个Java程序来实现我的城市游戏的自动化(我和我哥哥玩的小玩具车的真实游戏)。它不是100%的家庭作业或学校问题。
我制作了一个Citizen
课程和一个Jobs
课程。每个工作都有一个名字,基本收入,收入乘数(工作等级)。
我想为每个工作制作对象,并将每个公民连接到它,但我有这些问题:
答案 0 :(得分:1)
如果两个人有相同的工作,就会创建两个工作对象(我想成为一个)
两个主要选项:
Singleton
(如果您不知道单身是什么,只需谷歌搜索或在此处搜索)。Job Manager
(或Set
或Map
,但您可能需要List
)的单身Set
类,将作业名称配对到那个工作班的一个例子;然后你可以简单地获得一个参考,而不是创建一个新的。我不知道是否应该为每个工作单独制作课程(子课程),或者如果玩家在初始化新公民时有新工作,则创建一个新的工作对象。
你可能不应该这样做。相反,将所有作业共有的内容作为abstract
父类,然后将每个作业类实现为扩展。但是,如果您只需要Job
类中的变量来为每个单独的作业包含不同的值,那么您需要单个Job类的多个instances
,每个类都有自己的一组值。例如:
class Job{
public String name;
public float salary;
public float multiplier;
public Job(String name, float salary, float multiplier){
this.name=name;
this.salary=salary;
this.multiplier=multiplier;
}
}
//On Main
Job banker = new Job("Banker", 9000, 1);
Job seniorBanker = new Job("Senior Banker", 9000, 1.2f);
Job plumber = new Job("Plumber", 800, 1);
//...
//Assuming citizen class contains Job variable: public Job job;
Citizen jack = new Citizen();
jack.job = banker;
Citizen mario = new Citizen();
mario.job = plumber;
Citizen luigi = new Citizen();
luigi.job = plumber; //Same instance of 'plumber' as mario's...
//If you change the value of the plumber's job salary, and then do...
//system.out.println(mario.job.salary);
//system.out.println(luigi.job.salary);
//...both will be changed.
注意:正如您在上面所看到的,您当前的设计(从可以推断的内容)不会重复使用以前作业层中的数据,使multiplier
多余且有点无意义。
更好的设计是将作为Map
的工作类内置的排名,与特定名称和乘数配对。
确认注意事项:这基本上会将Job
类转换为Profession
类的等价物,这是garnulf在his answer中的建议。
答案 1 :(得分:0)
class Citizen{
String name;
.
.
.
Job job;
}
class Job{
// all fields you need
}
现在只需使用不同的参数实例化Job对象,然后在创建Citizen对象时,只需使用作业变量(在Citizen类中)来引用Job对象。因此,多个公民对象可以引用相同的Job对象。
答案 2 :(得分:0)
我认为您应该区分Job
和Profession
。每个Citizen
应该拥有自己的Job
,因为例如salary
和employer
是独立的。但每个Job
也与Profession
相关联,而Object
与共享相同Citizen
的不同Profession
相同enum
。对Profession
使用Object
可能是一个好主意,这样您就强制每个Profession
只有一个 ans = (A + B) - N + 1
。