Соглашение по Java add () - PullRequest
       10

Соглашение по Java add ()

2 голосов
/ 18 июня 2010

Итак, я обычно программист на ruby, поэтому мое понимание Java-соглашений в лучшем случае шатко.Если у меня есть класс A и я хочу определить метод для добавления двух экземпляров этого класса, каково соглашение о поведении и типе возвращаемого значения?

public class A
{
    //...
    public NotSureWhatTypeItShouldReturn add (A that) { /* ... */ }

Должен ли я

  • верните логическое значение, указывающее на успех, и измените цель, или
  • верните измененную копию цели и сгенерируйте исключение при ошибке

, что соответствует обычному соглашению Java для этого видаметод?

Ответы [ 7 ]

6 голосов
/ 18 июня 2010

Оба существуют: Collection.add изменяет коллекцию и возвращает логическое значение, а BigInteger.add возвращает новый BigInteger, который содержит сумму оригинала и переданногов экземпляре.

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

5 голосов
/ 18 июня 2010

Не возвращайте логическое значение, если это не «ожидаемый сбой», например, попытка добавить в набор.Если что-то на самом деле идет неправильно , сгенерируйте исключение.

Теперь вы можете вернуть измененную копию - или вы можете добавить существующий объект.Неизменность часто является хорошим свойством ... но большинство коллекций в Java изменчивы.Если вы идете по неизменному маршруту, вы можете захотеть рассмотреть , используя plus вместо add - это дает больше ощущения "есть результат, на который вы должны взглянуть, и я выиграл"сменить цель "ИМО.

3 голосов
/ 18 июня 2010

Все здесь думают о методе типа Collections.add ();но я сомневаюсь, что это то, что вы думаете.Вы больше в линейке, скажем, Vector2D.add(), которая добавляет компоненты x и y в Vector2D вместе?

На Java, насколько я могу судить, Collections обычно модифицируют себя (как и Collections.add).

Однако объект, не являющийся коллекцией (например, Vector2D), отличается больше.Среди соглашений, которые я видел:

  1. Cls add(Cls b), который возвращает новый объект и не изменяет существующие экземпляры
  2. void add(Cls b), который изменяет this и ничего не возвращает (т.е.возвращает void), он не должен изменять b.Нет смысла возвращать bool, так как этот тип добавления никогда не должен завершиться неудачей (и если это все равно произойдет, исключение будет уместным).
  3. Cls add(Cls a, Cls b), который возвращает новый объект, не изменяет нини бCls.add () - статический метод в классе Cls.

Лично я предпочитаю первый стиль для арифметического стиля add ();именно потому, что мы можем сделать a.add (b) .add (c) .add (d), который немного похож на «a + b + c + d».(Обычно я бы так не делал, если a - это Коллекция; поскольку последовательное добавление выглядит странно для объекта Коллекции.)

1 голос
/ 18 июня 2010

Я бы порекомендовал такое же поведение, как в Collection.add , это то, что я ожидал.

0 голосов
/ 18 июня 2010

Зависит от семантики вашего класса, но обычно это будет:

public void add( A that ) {
} 

Если вы намерены просто объединить элементы.

Вы можете использовать:

public boolean add( A that ) {
}

Если вы хотите узнать, была ли структура изменена или нет (Как в случае java.util.Set или коллекций в целом)

И вы можете использовать public A add( A that ){}, если вы хотите создать объект, подобный строителю (точно так же, как метод StringBuilder.append.

 A a = new A();
 a.add( a ).add( b ).add( c ).build();

Так, в зависимости от семантики вашего класса, вы можете использовать любой из них.

В большинстве случаев (+ 90%) я делаю первое: void add( A other ){}

0 голосов
/ 18 июня 2010

Это на самом деле не соглашение, а только то, что boolean Collection<E>.add(E) иллюстрирует:

Возвращает: true, если эта коллекция изменилась какрезультат вызова
Броски: UnsupportedOperationException - если операция add не поддерживается этой коллекцией

Методы JavaКлассы Collections Framework редко возвращают коллекцию, к которой они вызваны.То есть не идиоматично поддерживать это:

mySet.add(thisThing).add(thatThing).add(thoseAlso);

Некоторые классы в библиотеках Java используют стиль «плавный», например, Appendable, такой как StringBuilder, но ни один из основных классов Java Collections Framework этого не делает.

0 голосов
/ 18 июня 2010

Из API Java Collections :

Гарантирует, что эта коллекция содержит указанный элемент (необязательная операция).Возвращает true, если эта коллекция изменилась в результате вызова.(Возвращает false, если эта коллекция не допускает дублирования и уже содержит указанный элемент.)

Коллекции, поддерживающие эту операцию, могут накладывать ограничения на то, какие элементы могут быть добавлены в эту коллекцию.В частности, некоторые коллекции откажутся добавлять нулевые элементы, а другие наложат ограничения на тип элементов, которые могут быть добавлены.Классы коллекций должны четко указывать в своей документации любые ограничения на то, какие элементы могут быть добавлены.

Если коллекция отказывается добавлять конкретный элемент по какой-либо причине, кроме того, что она уже содержит элемент, она должна вызвать исключениеа не возвращать ложь).Это сохраняет инвариант, что коллекция всегда содержит указанный элемент после возврата этого вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...