【发布时间】:2013-10-11 21:16:36
【问题描述】:
这是一个我不确定如何用 Java 解决的问题。我想根据三种类型的数据(URI、String 或 Literal)制作三重语句,每种类型的编码方式都不同。我已经编写了接受这些类型的编码方法。
public static String makeStatement(URI subject, URI predicate, String object) {
return " " + encode(subject) + " " + encode(predicate) + " " + encode(object) + ".\n";
}
public static String makeStatement(String subject, URI predicate, String object) {
return " " + encode(subject) + " " + encode(predicate) + " " + encode(object) + ".\n";
}
public static String makeStatement(URI subject, URI predicate, Literal object) {
return " " + encode(subject) + " " + encode(predicate) + " " + encode(object) + ".\n";
}
private static String encode(String binding) {
return "?" + binding;
}
private static String encode(URI uri) {
return "<" + uri.stringValue() + ">";
}
private static String encode(Literal literal) {
return "\"" + literal.stringValue() + "\"" + literal.getDatatype();
}
但由于我可以接受这些类型的任何组合,这将需要 9 个 makeStatement 函数,它们基本上做同样的事情,这似乎是个坏主意,特别是因为我以后可能想添加另一种类型。
通常我会用创建超类的建议来回答这样的问题,但我无法编辑字符串、URI 和文字。另一种选择是定义
public static String makeStatement(Object subject, Object predicate, Object object) {
String encodedSubject = "", encodedPredicate = "", encodedObject = "";
if (subject.getClass().equals(URI.class)) {
encodedSubject = encode((URI) subject);
}
return " " + encode(encodedSubject) + " " + encode(encodedPredicate) + " " + encode(encodedObject) + ".\n";
}
然后检查每个参数的类,但我认为这不是很优雅。 另一个建议是定义诸如 makeStatement(URI subjectURI, String subjectString, Literal subjectLiteral, URI predicateURI.. etc) 之类的内容,然后检查哪些参数为空并从那里开始,但这意味着当我调用功能。 第三个选项是https://stackoverflow.com/a/12436592/1014666,但在调用 makeStatement 函数时,这同样需要一些额外的输入。
有什么建议吗?
【问题讨论】:
-
一位同事不久前遇到了类似的问题,他编写了一个 Python 脚本,将所有 9 种组合作为文本写入 .java 文件中
-
不错,但不是很优雅:)
-
编写一个通用方法来接受所有东西作为一个对象,并在其中执行检查实例并根据需要执行操作。它可能会给您其他视角。
-
@Mayilarun 我已经在我的问题中提到了这种可能性。
-
Masoom Raza 提出的建议并不是一个好的做法,因为带有签名
makeStatement(Object, Object, Object)的方法会阻止所有编译时类型检查。当然,你可以传入 URI、String 或 Literal 的任意组合,但你也可以传入 Date、BigDecimal、Socket 等等。
标签: java overloading