像Obj-C这样的Java类别?

时间:2013-11-23 16:02:22

标签: java oop objective-c-category

使用其他人的课程进行编程时,您经常会发现他们没有完全预测到您的需求,您必须使用一系列的步骤来完成一步操作。

IE,你正在使用一个索引对象的类,所以有一个getObjectAtIndex方法和一个getNameOfObjectAtIndex方法,但你想按名称而不是索引来访问对象,所以你必须编写一个使用getNumberOfIndexes方法并在每个循环上循环的循环,根据您想要的名称检查名称,返回索引,然后使用访问该索引处的对象。

如果您需要经常这样做,为了保持您的代码整洁,您应该重构。

在Obj-C中,解决方案是编写一个类别。您只需向该类(及其所有子类)添加新的getObjectWithName方法,而无需对其进行子类化或封装。

在Java中,我还没有找到一个特别好的解决方案。相反,我一直在编写没有在任何对象上调用但需要传入对象的辅助函数。基本上我有一个带有函数符号的方法,这很难理解。

要清楚,这不是我写的类,我没有源代码。其他一些代码正在创建并返回它,因此创建子类没有帮助,因为我无法更改返回它的代码以返回我的子类。我可以将它封装起来,但这似乎不如我现在所做的那么优雅。

有没有人知道我可以实现类似于Obj-C的Java类别的功能?

1 个答案:

答案 0 :(得分:1)

通常,Java开发人员最常使用辅助方法来处理此类事情。它灵活且相对模块化,并且真的没有您想象的那么糟糕。

相关技术是使用包装器对象;包含感兴趣的类的实例的类,实现相同的接口,并将大多数调用委托给包含的实例,可能在此过程中添加一些方法。一些IDE(当然,IntelliJ IDEA)具有内置工具,可以轻松创建这种委托包装器。然后,只要您收到对感兴趣的类的实例的引用,就可以在进行任何进一步处理之前构造其周围的委托者实例。

如果你真的想要更有趣的东西,总会有Aspect-Oriented Programming (AOP),它指的是在运行时根据各种标准将新代码注入现有代码的工具和技术。您可以使用AOP来做这样的事情;例如,通过向类添加接口以及实现它的方法。您必须在编译时将对象强制转换为接口才能使用该方法。