Ответ 1
Имейте в виду, что с вашим кодом вы фактически не проходите ObjectA
. А именно, вы передаете тип ссылки в ObjectA
, поэтому в заметке о производительности разница между передачей ссылки на объект String
и ссылкой на объект ObjectA
будет незначительной.
Как бы я это написал
Я бы передал весь объект, если метод относится к классу. Я рассуждаю об этом так, чтобы максимально разделить знания класса. Я имею в виду следующее.
public void doSomethingRelatedToTheClass(String param)
{
// Do something with param.
}
Моя первая критика здесь заключается в том, что этот метод предполагает, что ввод является правильным полем. Во-вторых, теперь классу, вызывающему этот код, нужно немного больше узнать об этом методе, потому что он должен вызывать его так:
doSomethingRelatedToTheClass(myObject.getValue());
И это означает, что если вы обнаружите, что другой член ObjectA
работает лучше в этом методе, или вы хотите получить доступ к другим членам ObjectA
, и вы изменили doSomething()
, чтобы отразить это изменение, вы необходимо изменить вызов метода, чтобы:
doSomethingRelatedToTheClass(myObject.getOtherValue(), myObject.getValue());
Таким образом, передавая весь объект, вы абстрагируете эту деталь, и метод может ее обработать; а именно:
doSomethingRelatedToTheClass(myObject); // Doesn't need to know what you do with it.
public void doSomethingRelatedToTheClass(ObjectA object)
{
String val = object.getValue();
String otherVal = object.getOtherValue();
}
Если изменение одного класса приводит к изменению других классов, это анти-шаблон называется Shotgun Surgery.
Изменить
У меня была возможность просмотреть мой ответ здесь, и я немного изменил свой первоначальный ответ, потому что я считаю, что это не лучшее решение для всех ситуаций. Как и выше, если метод связан конкретно с классом, то параметрированием должен быть экземпляр этого класса (или, более предпочтительно, его суперкласс или реализованный интерфейс [s]).
Это не тот случай, когда функциональность может быть общей. Примером универсальной функции может быть:
public String[] findNouns(String sentence);
В этом случае поиск существительных в предложении может быть подходящим для множества вариантов использования, а не только для определенных вами вариантов использования. Таким образом, передача значения является единственным разумным подходом, потому что в противном случае вы соединяете две части логики вместе, которые не имеют прямой связи. Нахождение существительных и произвольного объекта, который вы определили.
Вкратце
Если метод является логикой, связанной с объектом, передайте объект
Если метод не имеет ничего общего с объектом, и объект просто использует его как служебную функцию, тогда передайте значение и присвойте ему имя функции.