ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

通过向其添加方法来扩展Java库

2019-06-23 08:49:33  阅读:327  来源: 互联网

标签:java casting twitter4j


我试图了解如何在Java中正确地“扩展”第三方库(包括类和接口)以及如何简单地将它们用作插入式替换.

我目前正在使用Twitter4J库.现在我每次调用时都必须手动将@前缀为User的getScreenName()方法的结果:

twitter4j.User user = getTwitterUser();
String userHandle   = "@" + user.getScreenName();

我目前尝试过一些东西,但没有任何作用.这就是我想出来的:

package my.app;

public abstract class User implements twitter4j.User {
    public String getHandle() {
        return "@" + getScreenName();
    }
}

这样称呼它:

User user = (User) getTwitterUser();
String userHandle = user.getHandle();

这与消息崩溃:

java.lang.ClassCastException: twitter4j.UserJSONImpl cannot be cast to my.app.User

解决方法:

Java对象在现实世界中的工作方式有点像.

让我们做一个汽车比喻.你的汽车旁边有一个车库.所以你可以从车库买一辆车:

Car car = garage.buyCar(money);

车库碰巧卖的车是沃尔沃.所以,你得到一辆车,而这辆车(Car是一个接口)实际上是一辆沃尔沃.如果您知道汽车是沃尔沃汽车,那么您可以这样做:

Volvo car = (Volvo) garage.buyCar(money);

这根本不会改变车库出售汽车的方式,也不会改变车库销售的汽车类型.就是这样,因为你知道它们是volvos,你可以投出结果来获得沃尔沃汽车的特性.

请注意,这现在有效.但没有什么可以阻止车库,后来决定出售大众而不是沃尔沃.如果他们这样做,演员将不再工作,这将是你的错:车库告诉你它卖汽车,但不承诺它将是沃尔沃.

现在,您希望车库生产保时捷.想要做

Porsche car = (Porsche) garage.buyCar(money);

不行.只是因为你非常希望汽车成为一辆保时捷不会神奇地改变车库生产的沃尔沃保时捷.

你无法以这种方式扩展库

您所能做的就是获取用户并调用一个实用程序方法,该方法从该用户创建句柄.或者要创建自己的UserWithHandle类来实现User,添加一个getHandle()方法,并通过委托给原始的包装用户来实现所有其他方法:

UserWithHandle u = new UserWithHandle(getTwitterUser())

如果库允许您提供UserFactory实现,那么您可以按照自己的方式替换其创建用户的方式.有点像车库允许你提供自己的画家.

做你想要的,即在Java中不可能向现有类添加方法,但在某些语言中是可能的,例如Kotlin(与Java兼容并在JVM上运行,如果你感兴趣的话),它们在哪里称为扩展方法.基本上,这些方法是静态实用程序方法,例如,将User作为参数并返回其句柄,但可以调用它们,就好像它们是User的实例方法一样.

标签:java,casting,twitter4j
来源: https://codeday.me/bug/20190623/1269239.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有