Это вопрос о том, что я не уверен, как решить проблему на Java. Я хочу сделать тройные утверждения на основе трех типов данных, URI, String или Literal, каждый тип кодируется по-разному. Я написал методы кодирования, которые принимают эти типы.Принимая различные типы аргументов в 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 функций, которые в основном делают то же самое, и что кажется, что это плохая идея, тем более, что это может быть возможно, я хочу добавить еще тип позже.
Обычно я бы ответил на такой вопрос предложением создать суперкласс, но я не могу редактировать 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 .. и т. Д.), А затем проверить, какие аргументы являются нулевыми и идти оттуда, но это будет означать набор большого количества нулей при вызове функция. Третьим вариантом будет https://stackoverflow.com/a/12436592/1014666, но опять-таки это требует некоторого дополнительного ввода при вызове функции makeStatement.
Любые предложения?
Сотрудник столкнулся с аналогичной проблемой некоторое время назад, и он написал скрипт Python, который записывает все 9 комбинаций в виде текстового файла .java. – mbatchkarov
Nice, но не очень элегантный :) – Rhand
напишите общий метод, чтобы принять все как объект и внутри, которые выполняют экземпляр проверки и выполняют операцию по мере необходимости. Это может дать вам другую перспективу. – Arung