我正在使用JSoup编写一些东西,这是我在其他地方看到过的,许多方法都将字符串作为参数。
这种事情让我烦恼,我宁愿使用枚举值作为参数。使用HTML.Tag
'枚举'和.toString()
方法很容易设置。
然后在我的重载方法中,我将'enum'翻译成字符串并将其提供给原始方法。
所以我要去打电话:
Elements allDivs = bodyElem.getElementsByTag("DIV");
容易出现拼写错误而且不知道正确的标签名称等,以致于:
Elements allDivs = bodyElem.getElementsByTag(HTML.Tag.DIV))
但我无法想象如何重载getElementsByTag
以获取HTML.Tag
参数。
我试过这个:
Element bodyElem = doc.body(){
Elements getElementsByTag(HTML.Tag tag){
return getElementsByTag(tag.toString());
}
};
但这不起作用。指定this.getElementsByTag
是指持有类(例如HTMLReader,我写的那个),而super.getElementsByTag
指的是Object。
我担心我不能这样做,因为Element可能是最终的,就像this问题中的字符串一样。
那我该怎么做呢?
答案 0 :(得分:1)
JSoup的Element类型不是final,这意味着你可以扩展它,看起来你试图用匿名内部类来扩展它,但是你不能使用内部类来扩展现有的对象(doc.body()返回一个已经实例化的Element,你不能修改它。)
您的选择都取决于您想采取什么方法,以及哪些方案的成本/复杂性最高,效益比最高。
1。)直接扩展Element类,并将doc.body()的结果强制转换为包含重载的getElementsByTag方法的新类型。
2。)记住每次将它传递给现有的getElementsByTag方法时,都要在你的枚举类型上调用toString()方法,它更加冗长,但它或者是将每个元素转换为其他元素。
Java避免使用其他语言中的一些工具,比如C#的扩展方法(可以让你完全按照自己的意愿行事)以获得可读性和可维护性,不幸的是,有时会导致像这样的边缘情况没有它们可能会使代码变得有点难看。