我最近想知道,将参数传递给方法的三种方法中的哪一种 - 如下所示 - 最适合你,你的CPU,内存和原因。我正在考虑允许我在将来传递更多参数而不改变方法签名的方法。
如果你知道更好的事情,我会在这里倾听和学习。
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();
}
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;
}
}
用于获取文件的不同方法的一个界面。我不是坚持这是好还是不好,这只是我在当前工作项目中偶然发现的代码的一个例子,我想知道是否可以做得更好。
答案 0 :(得分:2)
在性能方面,“Params”类的使用优于属性。 java编译器可以很好地处理这些短期类。
我愿意:
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(即更改,添加或删除参数),可以采用的方法是将参数包装在对象中,以免破坏签名。