我正在与杰斯克,工人和管道做一些工作。我没关系;问题是我有一个新功能。我有一个名为FileAnalysis
的类,所以它有一些共同的属性,但它不够抽象;它仍然非常关注它的任务。
之前我制作了另一个功能,并且能够重复使用此FileAnalysis
。但是这次我正在使用的功能有新的关键属性,所以我创建了一个带有附加属性的新对象ContactFileAnalysis
。
FileAnalysis
由主对象组成,然后将其解析为JSON并存储在redis中。这是通过经理完成的;此管理器读取/写入redis,并重新创建FileAnalysis
对象。有一个支持对象来更新管道中的文件分析状态;它被称为:
FileAnalysisUpdater(FileAnalysis).
如果我创建一个能够处理ContactFileAnalysis
的新管理器,则此对象包含新属性,新管理器将正确地将它们存储在redis中。然后它在管道中调用更新程序。我想要实现的是调用
ContactFileAnalysis contactFileAnalysis;
updater.Update((FileAnalysis) contactFileAnalysis);
当我转换为父对象并且管道完成后,更新程序会更新contactFileAnalysis
吗?或者这个演员是否会改变对象引用,因此不会反映出任何变化?
我想重用此功能,因为它没有任何变化;行为是一样的,信息是一样的;我只需要传播新的信息,并且这样做我坚持使用redis,但是从那里开始它就是一样的;更新程序不需要我的新对象。
P.S。:我知道再次编写每个涉及的对象并确保它与新的FileAnalysis一起工作更安全,但这意味着很多代码很难使用而且不那么重要。此外,我为这个项目工作,并不容易批准4k行代码的PR。
答案 0 :(得分:2)
正如user2864740在注释中指出的那样,转换对象引用永远不会更改引用。你可以很容易地测试这个:
Object obj = null;
String str = "foo";
obj = (Object) str; // Unnecessary! See below.
System.out.println ("Is str == obj? " + (str == obj));
但是,向父母施放可能是不必要的。希望您声明ContactFileAnalysis
是FileAnalysis
的子类:
public class ContactFileAnalysis extends FileAnalysis
如果是这样,那么对ContactFileAnalysis
实例的任何引用始终被视为对FileAnalysis
实例的引用。实际上,它也是对FileAnalysis
'超类的实例的引用,依此类推(到java.lang.Object
,所有java对象的父级)。这意味着我在示例代码中转换为Object
是不必要的:
obj = str; // This works, and is considered proper style.
也没有必要将其转换为updater.Update()
。 (另一种风格说明:方法应以小写字母开头。)
updater.Update(contactFileAnalysis); // Probably fine. See below.
请注意,如果您未将ContactFileAnalysis
声明为FileAnalysis
的子类,则将必须投射它。 (如果你有一个实现了两个接口的类,引用了一个类型为其中一个接口的实例,并希望将它传递给一个接受另一个接口实例的方法,就会发生这种情况。)
另一个注意事项:如果由于某种原因你有两种方法如下:
public void update (FileAnalysis fa) { /* code */ }
public void update (ContactFileAnalysis cfa) { /* ugh */ }
您引用了ContactFileAnalysis
实例,并将其传递给更新程序:
ContactFileAnalysis myCFA = new ContactFileAnalysis();
updater.update (myCFA);
它将使用 second update
- 定义为接受CFA的那个。然而,施展它:
updater.update ((FileAnalysis) myCFA);
并且它将首先使用 update
。如果您为其设置FileAnalysis
变量,则会发生同样的事情。
FileAnalysis myFA = myCFA;
updater.update (myFA); // uses the first update, even though it's a CFA
希望你明白为什么。如果没有,请查看official documentation on inheritance。