3

我发布了一个扩展使用的 C# 示例,以使我的问题更清楚。我有一个名为 Parameter 的简单类,它有两个属性:键和值。我正在扩展参数列表,以便能够检查列表中是否包含某个键:

参数类:

public class Parameter
{
    private String key { get; set; }
    private String value { get; set; }
}

参数扩展类:

public static class ParameterListExtension
{
    public static bool contain(this List<Parameter> parameters, String key)
    {
        foreach (Parameter parameter in parameters) {
            if (parameter.key.Equals(key)) { return true; } }
        return false;
    }
}

扩展的用法:

List<Parameter> parameters = getParameters();
if (parameters.contain("myParameter")) { ... }

这可以用Java完成吗?

4

4 回答 4

2

Java 有一个扩展,称为Xtend,它增加了对扩展方法的支持(以及其他特性)。Xtend 的一些特性应该是 Java 8 附带的。根据我的经验,Xtend 有时很好,尤其是在编写测​​试时,但 Ecplise 中的工具支持远不如纯 Java。据我所知,没有其他 IDE 支持 Xtend。

于 2013-09-24T10:05:33.420 回答
2

在 Java 7 及更早版本中,无法按照描述的方式执行此操作。解决方案是使用其他答案中描述的“帮助器”类。

在 Java 8 中,您可以“某种程度地”使用default方法来做到这一点。考虑以下:

public interface Parameter {
    // getters and setters
}

public class ParameterImpl implements Parameter {
    // Implements the getters and setters and the state variables.
}

现在假设我们修改Parameter如下:

public interface Parameter {
    // getters and setters as before

    public default boolean contain(this List<Parameter> parameters, String key) {
        // (Do not copy this!  There are better ways to code this in Java 8 ...
        //  ... but that is beside the point.)
        for (Parameter parameter : parameters) {
            if (parameter.getKey().equals(key)) { 
                 return true; 
            } 
        }
        return false;
    }
}

我们可以在修改实现接口的 es 并且不破坏二进制兼容性的情况下对interface(正向)进行此更改。class

当然,这只有在我们有远见地创建单独的接口和类时才有效。Parameter(但如果我们不这样做,我会认为修改类以添加扩展方法没什么“大不了的” 。)

于 2013-09-24T11:11:52.373 回答
1

Java 中没有这样的机制来扩展已定义类的行为,使其脱离您的控制。或者,可以定义和使用辅助类和接口,尽管它们不能 100% 达到目的,尤其是在关注可见性时。

于 2013-09-24T09:31:17.823 回答
1
public class ParameterListExtension
{
  public static boolean contain(List<Parameter> parameters, String key)
  {
    for(Parameter parameter:parameters)
      if(parameter.key.equals(key)) return true;
    return false;
  }
}

…</p>

import static ParameterListExtension.contain;
…
List<Parameter> parameters = getParameters();
if(contain(parameters, "myParameter")) { ... }

我看不出混淆方法的来源并假装它是列表的实例方法的优势。

于 2013-09-24T09:43:19.243 回答