按类字段传递参数,重写类方法或属性

时间:2016-05-10 13:10:01

标签: java

我最近想知道,将参数传递给方法的三种方法中的哪一种 - 如下所示 - 最适合你,你的CPU,内存和原因。我正在考虑允许我在将来传递更多参数而不改变方法签名的方法。

如果你知道更好的事情,我会在这里倾听和学习。

按方法传递

Params.java

public interface Params {
    int getParamOne();
    int getParamTwo();
}

调用

obj.foo(new Params() {

    @Override
    public int getParamOne() {
        return 1;
    }

    @Override
    public int getParamOne() {
        return 2;
    }
});

接收

public void foo(Params p) {
    int p1 = p.getParamOne();
    int p2 = p.getParamTwo();
}

按类字段传递

Params.java

public class Params {
    private int paramOne;
    private int paramTwo;

    // Getters and setters here
}

致电和接听

这里没有魔法,只需创建一个新的Params对象,使用setter,将其传递给方法并使用getter。

通过属性类

调用

properties.put("paramOne", 1);
properties.put("paramTwo", 2);
obj.foo(properties);

接收

public void foo(Properties properties) {
    int a = (int) properties.get("paramOne");
    int b = (int) properties.get("paramTwo");
}

我很高兴地展示了一个真实的代码示例,它实际上需要传递不同类型和数量的属性。我正在使用第三种方法 - 通过属性传递:

public interface DataProvider {
    public String getContent(Properties properties);
}

public class HttpProvider implements DataProvider {
    @Override
    public String getContent(Properties properties) {
        InputStream in = new URL(properties.get("URL")).openStream();
        String content = IOUtils.toString(in);
        IOUtils.closeQuietly(in);
        return content;
    }

public class FtpProvider implements DataProvider {
    @Override
    public String getContent(Properties properties) {
        FTPClient ftpClient = new FTPClient();
        ftpClient.connect(properties.get("server"), properties.get("port"));
        ftpClient.login(properties.get("user"), properties.get("pass"));
        // Get file stream and save the content to a variable here
        return content;
    }
}

用于获取文件的不同方法的一个界面。我不是坚持这是好还是不好,这只是我在当前工作项目中偶然发现的代码的一个例子,我想知道是否可以做得更好。

2 个答案:

答案 0 :(得分:2)

在性能方面,“Params”类的使用优于属性。 java编译器可以很好地处理这些短期类。

  • 可以看到某些构造函数/工厂方法的属性,例如XML等。
  • 我们在较大的系统中看到一个包含类的参数,以便将API限制为一个参数,而不是使用重载的方法。

我愿意:

public class Params {
    public final int a;
    public final int b;

    public Params(int a, int b) {
        this.a = a;
        this.b = b;
    }
}

在课堂上立即使用params.a

其余的还有 Builder Pattern ,但这可以替代复杂的构造函数。

答案 1 :(得分:0)

界面中的签名不应该改变!如果您打算在将来更改API(即更改,添加或删除参数),可以采用的方法是将参数包装在对象中,以免破坏签名。