这是一个关于我不确定如何在Java中解决的问题。我想根据三种类型的数据(URI,字符串或文字)制作三重语句,每种类型的编码方式都不相同。我已经编写了接受这些类型的编码方法。在Java中接受不同类型的参数
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功能,基本上做同样的事情的任意组合,这似乎像一个坏主意,特别是因为有可能我想补充另一稍后键入。
通常我会回答这样一个问题,建议创建一个superClass,但我不能编辑String,URI和Literal。另一种选择是定义
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 ..等)之类的东西,然后检查哪些参数为null并从那里开始,但这意味着当我打电话时输入很多空值功能。 第三个选项是https://stackoverflow.com/a/12436592/1014666,但这又需要在调用makeStatement函数时进行一些额外的输入。
有什么建议吗?
一个同事面对类似的问题,他回来了,他写了一个Python脚本,将所有9个组合写成.java文件中的文本 – mbatchkarov
不错,但不是很优雅:) – Rhand
编写一个通用方法接受所有对象作为对象并在里面做检查的实例,并根据需要执行操作。它可能会给你另一种观点。 – Arung