我可以使用枚举元素而不是字符串将JSoup Elements类重载到getElementsByTag吗?

时间:2014-01-12 16:33:19

标签: java enums overloading

我正在使用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问题中的字符串一样。

那我该怎么做呢?

1 个答案:

答案 0 :(得分:1)

JSoup的Element类型不是final,这意味着你可以扩展它,看起来你试图用匿名内部类来扩展它,但是你不能使用内部类来扩展现有的对象(doc.body()返回一个已经实例化的Element,你不能修改它。)

您的选择都取决于您想采取什么方法,以及哪些方案的成本/复杂性最高,​​效益比最高。

1。)直接扩展Element类,并将doc.body()的结果强制转换为包含重载的getElementsByTag方法的新类型。

2。)记住每次将它传递给现有的getElementsByTag方法时,都要在你的枚举类型上调用toString()方法,它更加冗长,但它或者是将每个元素转换为其他元素。

Java避免使用其他语言中的一些工具,比如C#的扩展方法(可以让你完全按照自己的意愿行事)以获得可读性和可维护性,不幸的是,有时会导致像这样的边缘情况没有它们可能会使代码变得有点难看。