假设我在Human
中有一个名为ProjectA
的班级。它在同一项目的CreatureBuilder
类中实例化。
现在我想在另一个项目中创建一个名为Cyborg
的新类,即ProjectB
。 ProjectB
在其导入中有ProjectA
,但ProjectA
对ProjectB
一无所知。
Cyborg extends Human
,并且还必须由CreatureBuilder
的{{1}}实例化(因此,ProjectA
位于Cyborg
,我致电ProjectB
从CreatureBuilder
到实例化ProjectB
,但Cyborg
位于CreatureBuilder
,以及我的ProjectA
类。
我需要一个逻辑来在Human
从Human
实例化时创建CreatureBuilder
,并在ProjectA
从{Cyborg
实例化时创建CreatureBuilder
1}}。
我认为通过在ProjectB
中使用getCreature()
方法创建界面是可以实现的。此方法将在ProjectA
到ProjectB
中重写,然后传回return new Cyborg
的{{1}}。
还有其他建议吗?您认为最好的解决方法是什么?我可以改用反射API吗?
干杯!
答案 0 :(得分:4)
CreatureBuilder
可以通过要求Supplier将创作者的创作委托给来电者。
public class CreatureBuilder {
public Creature getCreature(Supplier<Creature> creatureSupplier)
{
//do some unknown things
return creatureSupplier.get();
}
}
ProjectA的用法
public class ProjectA {
public static void main(String[] args) {
Creature A = new CreatureBuilder().getCreature(Human::new);
}
}
ProjectB的用法
public class ProjectB {
public static void main(String[] args) {
Creature B = new CreatureBuilder().getCreature(Cyborg::new);
}
}
如果你没有被迫,就不要使用反思。
如果您坚持使用Java 7,原则仍然相同,只是它更冗长。
您必须声明并使用您自己的类似供应商的界面
public interface CreatureSupplier {
Creature get();
}
public class CreatureBuilder {
public Creature getCreature(CreatureSupplier creatureSupplier)
{
//do some things
return creatureSupplier.get();
}
}
用法稍微冗长
public class ProjectA {
public static void main(String[] args) {
Creature A = new CreatureBuilder().getCreature(new CreatureSupplier() {
@Override
public Creature get() {
return new Human();
}
});
}
}
public class ProjectB {
public static void main(String[] args) {
Creature B = new CreatureBuilder().getCreature(new CreatureSupplier() {
@Override
public Creature get() {
return new Cyborg();
}
});
}
}
而且......那就是它,你得到了与Java 8中相同的行为。
答案 1 :(得分:0)
我认为你正在看工厂模式。是的,您可以使用项目A中的接口和工厂类以及扩展它的B中的工厂类来完成它。
示例:
在项目A中:
public interface CreatureBuilder
{
Creature getCreature(String type);
}
public class Creature
{
//fields of Creature class
}
public class Human extends Creature
{
//fields of Human
}
public class Ape extends Creature
{
//fields of Ape
}
public class ProjectAFactory implements CreatureBuilder
{
@Override
public Creature getCreature( String type )
{
switch(type)
{
case("Human"): return new Human();
case("Ape") : return new Ape();
default : return null;
}
}
}
您可以致电ProjectAFactory.getCreature("Human");
创建人物对象
然后在项目B中
public class ProjectBFactory extends ProjectAFactory
{
@Override
public Creature getCreature(String type)
{
switch(type)
{
case ( "Cyborg" ) : return new Cyborg();
default : return super.getCreature(type);
}
}
}
public class Cyborg extends Creature
{
//fields related to Cyborg which also fields of Creature in project A
}
您可以致电ProjectBFactory.getCreature("Cyborg");
创建Cyborg甚至ProjectBFactory.getCreature("Human")
以获取人物对象。