これは、Java で解決する方法がわからないことについての質問です。URI、文字列、リテラルの 3 種類のデータに基づいてトリプル ステートメントを作成したいと考えています。各タイプは別々にエンコードされています。これらの型を受け入れるエンコード メソッドを作成しました。
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) のようなものを定義し、どの引数が null であるかを確認してそこから移動することですが、それは、私が呼び出すときに多くの null を入力することを意味します関数。3 番目のオプションはhttps://stackoverflow.com/a/12436592/1014666ですが、これも makeStatement 関数を呼び出すときにかなり余分な入力が必要になります。
助言がありますか?