转换为父级更改对象引用?

时间:2016-12-19 17:23:24

标签: java spring redis

我正在与杰斯克,工人和管道做一些工作。我没关系;问题是我有一个新功能。我有一个名为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。

1 个答案:

答案 0 :(得分:2)

正如user2864740在注释中指出的那样,转换对象引用永远不会更改引用。你可以很容易地测试这个:

Object obj = null;
String str = "foo";
obj = (Object) str; // Unnecessary! See below.
System.out.println ("Is str == obj? " + (str == obj));

但是,向父母施放可能是不必要的。希望您声明ContactFileAnalysisFileAnalysis的子类:

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