2010-08-12 9 views
1

Я пишу несколько javadoc и задавался вопросом, как подчеркнуть параметр out.Как указать параметры и параметры?

В настоящее время я делаю это (очень простой)

/** 
* @param cl  (IN Parameter) description here <br/> 
* @param nodes  (OUT Parameter) description here <br/> 
* @param holotypes (OUT Parameter) description here <br/> 
*/ 
public void getNodes(List<O> cl, List<Node<O>> nodes, List<O> holotypes) {...} 
+5

Лично я стараюсь избегать параметров и вместо этого возвращать объект, который содержит параметры out. Я считаю, что код обычно намного лучше. – TofuBeer

+0

@TofuBeer Я тоже, но не могу сделать это, когда мне нужно вернуть 2 списка. Здесь не возможны два разных метода, так что это то, что у меня есть. Возврат одного списка и передача другого в качестве параметра out. является худшим вариантом ИМХО. – Tom

+4

Вы можете вернуть List [] и документ, что он всегда будет иметь размер 2. Или вы можете создать класс, который обертывает 2 списка (например, struct). –

ответ

3

Ваш Javadoc выглядит хорошо для меня. ясно и понятно. Не забудьте добавить, что в списках есть и есть, чтобы быть настроенным, иначе метод может жаловаться на неприятные исключения. Так много для ответа.

Но я предлагаю вам не использовать параметры out, если вы не вынуждены это делать (например, если вам нужно реализовать сторонние интерфейсы или вам нужно использовать JNDI).

Метод называется getNodes, поэтому большинство программистов ожидают, что метод возвращает массив или набор узлов. Но в этом случае метод заполняет два переданных списка узлами и голотипами.

Так что если ваш свободный выбор сигнатуру метода, я предлагаю вам объявить его как это:

public List<O> getNodes(List<O> cl) { 
    List<O> result = pickAllNodesFromList(cl); 
    return result; 
} 

public List<O> getHolotypes(List<O> cl) { 
    List<O> result = pickAllHolotypesFromList(cl); 
    return result; 
} 

или объявить специальный тип для класса, как:

class CLTypes<O> { 
    List<O> nodes = new ArrayList<O>(); 
    List<O> holotypes = new ArrayList<O>(); 

    CLTypes(List<O> cl) { 
    nodes.addAll(pickAllNodes(cl)); 
    holotypes.addAll(pickAllNodes(cl)); 
    } 

    // getters for the nodes 
    // ... 

    // private methods to pick objects for source list 
    // ... 
} 

и реализовать метод как это:

public CLTypes<O> getNodes(List<O> cl) { 
    return new CLTypes<O>(cl); 
} 

Если вам необходимо вернуть два списка (как я прочитал с комментариев выше), другое простым решение может быть оборачивать два списка в карте:

public Map<String, List<O>> getNodes(List<O> cl) { 
    Map<String, List<O>> result = new HashMap<String, List<O>>(); 
    result.put("nodes", pickAllNodes(cl)); 
    result.put("holotypes", pickAllHolotypes(cl)); 
    return result; 
} 
+0

спасибо за ваши предложения – Tom

+0

Всегда пожалуйста, просто проигнорируйте их, если вы не можете изменить подпись метода;) –

6

Строго говоря, вы не можете реализовать OUT параметров в Java. Все параметры IN и передаются по значению ... где значение является ссылкой для ссылочных типов.

В вашем примере параметры показывают, чтобы вести себя как параметры OUT, поскольку они являются изменяемыми коллекциями. Но это иллюзия. Например:

res = null; 
    make(res); 
    assert res != null; // this would succeed with a real OUT parameter 

    public void make(List<String> p /* OUT parameter */) { 
     p = new ArrayList<String>(); 
    } 

Теперь, если вы чувствуете, как маркировка этих параметров «IN» и параметров «OUT» в вашей проектной документации, это нормально (при условии, что вы четко документировать то, что вы имеете в виду этикетки).

Но вы обычно не видите эту терминологию, используемую в javadocs, потому что, строго говоря, это неправильный ... относительно стандартной терминологии, преподаваемой на курсах сравнительного программирования, начиная с по крайней мере 1970-х годов.

0

Вы можете создавать аннотации In и Out. Аннотируйте эти аннотации с документированной аннотацией. I думаю, что вы можете применить аннотации к параметрам в самой последней JAVA. (Если вы не можете игнорировать этот ответ.) Эти аннотации должны отображаться в ваших javadocs.

Смежные вопросы