Questa è una domanda su qualcosa che non sono sicuro su come risolvere in Java. Voglio fare affermazioni triple basate su tre tipi di dati, URI, String o Letterali, ogni tipo è codificato in modo diverso. Ho scritto metodi di codifica che accettano questi tipi.Accettare diversi tipi di argomenti in 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();
}
Ma, come posso accettare qualsiasi combinazione di questi tipi di ciò richiederebbe 9 funzioni makeStatement, che sono fondamentalmente facendo la stessa cosa e che sembra una cattiva idea, soprattutto perché potrebbe essere possibile voglio aggiungere un altro digita più tardi.
Normalmente risponderei a una domanda del genere con il suggerimento di creare una super classe, ma non posso modificare String, URI e Literal. Un'altra opzione sarebbe quella di definire
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";
}
e quindi controllare le classi per ogni argomento, ma questo non considerare molto elegante. Un altro suggerimento sarebbe quello di definire qualcosa come makeStatement (URI subjectURI, String subjectString, Literal subjectLiteral, URI predicateURI .. etc) e quindi controllare quali argomenti sono nulli e passare da lì, ma ciò significherebbe digitare un sacco di null quando chiamo la funzione. Una terza opzione è https://stackoverflow.com/a/12436592/1014666, ma anche in questo caso è necessaria una digitazione aggiuntiva quando si chiama la funzione makeStatement.
Qualche suggerimento?
Un collega ha affrontato un problema simile qualche tempo fa e ha scritto uno script Python che scrive tutte le 9 combinazioni come testo nel file .java – mbatchkarov
Bello, ma non molto elegante :) – Rhand
scrivere un metodo generico per accettare tutto come un oggetto e dentro che fanno l'istanza di controllo ed eseguono l'operazione di cui hai bisogno. Potrebbe darti un'altra prospettiva. – Arung