Java 当它';有必要吗?
我的公司软件面临着一个令人沮丧的问题,我无法找到解决办法。(这是一个到位的东西,我无法改变整个概念) 我将试着用一个例子来说明整个上下文:基本上,我们有两个软件组件,比如BrickHigh,BrickLow。BrickLow可以使用BrickHigh中的所有东西,但BrickHigh看不到BrickLow 在BrickHigh中有一个动物类(数十个属性)及其DAO:Java 当它';有必要吗?,java,downcast,Java,Downcast,我的公司软件面临着一个令人沮丧的问题,我无法找到解决办法。(这是一个到位的东西,我无法改变整个概念) 我将试着用一个例子来说明整个上下文:基本上,我们有两个软件组件,比如BrickHigh,BrickLow。BrickLow可以使用BrickHigh中的所有东西,但BrickHigh看不到BrickLow 在BrickHigh中有一个动物类(数十个属性)及其DAO: public class Animal .. { //attributes... } 在BrickLow中,我创建了一个Cat
public class Animal .. {
//attributes...
}
在BrickLow中,我创建了一个Cat类(还有几十个未映射的属性),它扩展了Animal
public class Cat extends Animal {
//attributes
}
我们打算做的是为每个映射属性创建一个超级类(Animal)。但是我不能在我的应用程序中使用我的animal类,因为整个应用程序都使用Cat,所以会有太多的更改
但很明显,我不能在从DAO获得动物后将其扔给猫,因为Java不允许这样做,而且我需要动物提供的所有信息
因为我的砖房没有看到我的砖房,所以没有动物=新猫()之类的东西;可能
我的第一个想法是在Cat中创建一个构造函数,它将动物作为参数
public Cat(Animal a) {
super(a);
}
但我的构造函数在我的动物类中必须是什么?它似乎不起作用
但我的构造函数在我的动物类中必须是什么?它似乎不起作用
大概是这样的:
public Animal(Animal other) {
this.field1 = other.field1;
this.field2 = other.field2;
// etc
}
但是,我认为使用对象工厂模式可能更好;i、 e.让DAO类接受一个参数,该参数是一个工厂对象,可以创建Animal
实例。当您在使用BrickLow API的代码中使用DAO(来自BrickHigh)时,您可以使用生产Cat
实例而不是Animal
实例的工厂实例化if
但我的构造函数在我的动物类中必须是什么?它似乎不起作用
大概是这样的:
public Animal(Animal other) {
this.field1 = other.field1;
this.field2 = other.field2;
// etc
}
但是,我认为使用对象工厂模式可能更好;i、 e.让DAO类接受一个参数,该参数是一个工厂对象,可以创建
Animal
实例。当您在使用BrickLow API的代码中使用DAO(来自BrickHigh)时,您可以使用生产Cat
实例而不是Animal
实例的工厂来实例化if。我不确定我是否完全理解您的问题,但是如果您想从BrickHigh的代码中创建某个动物类的实例,但是,在不了解BrickLow的情况下,您可以使用工厂,也可以使用由DAO的一个或多个属性标识的类对象
例如:
public interface AnimalFactory {
boolean canInstanciate(AnimalDAO dao);
Animal instanciate(AnimalDAO dao);
}
public enum AnimalFactories implements AnimalFactory {
INSTANCE;
private List<AnimalFactory> factories = new ArrayList<>();
public void registerFactory(AnimalFactory factory) {
factories.add(factory);
}
@Override
public boolean canInstanciate(AnimalDAO dao) {
for (AnimalFactory fac: factories) {
if (fac.canInstanciate(dao)) {
return true;
}
}
return false;
}
@Override
public Animal instanciate(AnimalDAO dao) {
for (AnimalFactory fac: factories) {
if (fac.canInstanciate(dao)) {
return fac.instanciate(dao);
}
}
throw new InstanciationException("No factory for that animal");
}
}
你的砖房将有一套工厂,并将提供一个机制来注册新的工厂
例如:
public interface AnimalFactory {
boolean canInstanciate(AnimalDAO dao);
Animal instanciate(AnimalDAO dao);
}
public enum AnimalFactories implements AnimalFactory {
INSTANCE;
private List<AnimalFactory> factories = new ArrayList<>();
public void registerFactory(AnimalFactory factory) {
factories.add(factory);
}
@Override
public boolean canInstanciate(AnimalDAO dao) {
for (AnimalFactory fac: factories) {
if (fac.canInstanciate(dao)) {
return true;
}
}
return false;
}
@Override
public Animal instanciate(AnimalDAO dao) {
for (AnimalFactory fac: factories) {
if (fac.canInstanciate(dao)) {
return fac.instanciate(dao);
}
}
throw new InstanciationException("No factory for that animal");
}
}
公共枚举AnimalFactories实现AnimalFactory{
实例;
私有列表工厂=新的ArrayList();
公共无效登记工厂(动物工厂){
工厂。添加(工厂);
}
@凌驾
公共布尔犬舍(动物道){
适用于(畜牧业工厂){
if(工厂CANInstantate(dao)){
返回true;
}
}
返回false;
}
@凌驾
公共动物标本(动物道){
适用于(畜牧业工厂){
if(工厂CANInstantate(dao)){
返回因子实例(dao);
}
}
抛出新的InstanceException(“该动物没有工厂”);
}
}
我不确定我是否完全理解您的问题,但是如果您想从BrickHigh代码中创建某个动物类的实例,但不了解BrickLow,您可以使用工厂,或者使用由DAO的一个或多个属性标识的类对象
例如:
public interface AnimalFactory {
boolean canInstanciate(AnimalDAO dao);
Animal instanciate(AnimalDAO dao);
}
public enum AnimalFactories implements AnimalFactory {
INSTANCE;
private List<AnimalFactory> factories = new ArrayList<>();
public void registerFactory(AnimalFactory factory) {
factories.add(factory);
}
@Override
public boolean canInstanciate(AnimalDAO dao) {
for (AnimalFactory fac: factories) {
if (fac.canInstanciate(dao)) {
return true;
}
}
return false;
}
@Override
public Animal instanciate(AnimalDAO dao) {
for (AnimalFactory fac: factories) {
if (fac.canInstanciate(dao)) {
return fac.instanciate(dao);
}
}
throw new InstanciationException("No factory for that animal");
}
}
你的砖房将有一套工厂,并将提供一个机制来注册新的工厂
例如:
public interface AnimalFactory {
boolean canInstanciate(AnimalDAO dao);
Animal instanciate(AnimalDAO dao);
}
public enum AnimalFactories implements AnimalFactory {
INSTANCE;
private List<AnimalFactory> factories = new ArrayList<>();
public void registerFactory(AnimalFactory factory) {
factories.add(factory);
}
@Override
public boolean canInstanciate(AnimalDAO dao) {
for (AnimalFactory fac: factories) {
if (fac.canInstanciate(dao)) {
return true;
}
}
return false;
}
@Override
public Animal instanciate(AnimalDAO dao) {
for (AnimalFactory fac: factories) {
if (fac.canInstanciate(dao)) {
return fac.instanciate(dao);
}
}
throw new InstanciationException("No factory for that animal");
}
}
公共枚举AnimalFactories实现AnimalFactory{
实例;
私有列表工厂=新的ArrayList();
公共无效登记工厂(动物工厂){
工厂。添加(工厂);
}
@凌驾
公共布尔犬舍(动物道){
适用于(畜牧业工厂){
if(工厂CANInstantate(dao)){
返回true;
}
}
返回false;
}
@凌驾
公共动物标本(动物道){
适用于(畜牧业工厂){
if(工厂CANInstantate(dao)){
返回因子实例(dao);
}
}
抛出新的InstanceException(“该动物没有工厂”);
}
}
如果没有一个具体的例子来清楚地说明问题,这一切都只是胡言乱语,没有多大意义。我知道你试图避免发布NDA的代码,但你现在遇到的只是一个很难解释的理论问题,在翻译过程中丢失了微妙的细节。当你开始使用自己的自定义术语,如“母类”(是超级类,对吧?)时,真的很难理解。这也很难解决“在BrickLow中,我创建了一个Cat类”和“因为整个应用程序都使用Cat,所以会有太多的更改”。我同意,我们需要更好地解释您试图做的事情,当然,使用标准Java术语会有所帮助。当您说“在BrickLow中,我创建了一个Cat类”“,您的意思是它是内部的吗?您可以通过反射在BrickHigh中访问Cat类及其实例变量(或getter/setter方法)。这是我的猜测……谢谢你的投入,我尝试过编辑它,但我可能让它变得更糟。没有一个具体的例子清楚地说明问题,这一切都是胡言乱语,没有多大意义。我知道你们试图避免发布NDA的代码,但你们现在遇到的只是一个理论问题,很难用del解释