这是一个关于我不确定如何在 Java 中解决的问题。我想根据三种类型的数据(URI、字符串或文字)制作三重语句,每种类型的编码都不同。我已经编写了接受这些类型的编码方法。
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 函数时,这同样需要一些额外的输入。
有什么建议么?