Назначить переменную внутри метода

#java

#java

Вопрос:

Все объекты (p1, p2 buyer, seller) относятся к одному классу, и изначально объекты buyer и seller имеют значение null. В зависимости от типа документа, который мне нужен, назначьте p1 и p2 либо продавцу, либо покупателю.

 Class EmailSenderUtil{
public void sendPendingActionEmail(Document Type, PartyType p1, PartyType p2){
  PartyType buyer = null;
  PartyType seller = null;
  /// some other computations

  else if(documentType.equals(DocumentType.REQUESTFORQUOTATION)) {
      assignInitiatorAsBuyer(p1, p2, buyer, seller);
     // set some other variable unique to this type
  }
}

private void assignInitiatorAsBuyer(PartyType p1, PartyType p2, PartyType buyer, PartyType seller) {
        buyer = p1;
        seller = p2;
    }
private void assignInitiatorAsSeller(PartyType p1, PartyType p2, PartyType buyer, PartyType seller) {
        buyer = p2;
        seller = p1;
    }
}
  

Я могу назначить эти переменные в 2 строках, но, поскольку условий else if много (10), чтобы уменьшить избыточность, я переместил это назначение внутрь метода. Но поскольку Java передается по значению, присвоения не отражаются на родительском методе.

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

Комментарии:

1. Не передавайте покупателя и продавца в качестве аргумента. Используйте this.buyer и this.seller в своих методах.

2. Где находятся эти методы? Назначение переменным экземпляра ( this.buyer ) вместо локальных переменных — это не вариант?

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

4. Есть ли какие-либо из четырех переменных класса objects в классе, куда вы хотите добавить методы?

5. Я обновил вопрос. Все методы определены внутри класса util. Спасибо за ответы, я смогу использовать this. подход такой же.

Ответ №1:

После изменений, приведенных в вопросе, я думаю, теперь мы можем использовать подход, при котором мы можем удалить покупателя и продавца из метода и использовать это.buyer = p1

 Class EmailSenderUtil{
   PartyType buyer = null;
   PartyType seller = null;
    public void sendPendingActionEmail(Document Type, PartyType p1, PartyType p2){
 // .....
 // rest of the code

else if(documentType.equals(DocumentType.REQUESTFORQUOTATION)) {
    assignInitiatorAsBuyer(p1, p2, buyer, seller);
  }
}

private void assignInitiatorAsBuyer(PartyType p1, PartyType p2) {
    this.buyer = p1;
    this.seller = p2;
}
private void assignInitiatorAsSeller(PartyType p1, PartyType p2) {
    this.buyer = p2;
    this.seller = p1;
}
  

Комментарии:

1. Редактирование кода. я думал, что эти 2 были переменными экземпляра, как в моем отредактированном ответе

2. да .. я видел это .. вот почему я изменил свой код .. мой код действителен, только если 2 переменные являются переменными экземпляра, как в моем коде.

3. В вопросе методы не являются статическими, но в случае, если это так, я могу придумать альтернативный подход, при котором мы можем заставить функцию возвращать покупателя и продавца (оба, например, в виде объекта или списка), и они могут быть получены в блоке else if при вызове функции. Я также обновлю код для этого через некоторое время.

4. Теперь я заметил в комментарии от OP, что this все в порядке, поэтому больше не нужно обновлять вопрос. Извините за весь шум 🙂

Ответ №2:

Если методы уже присутствуют в PartyType , используйте эти:

 else if(documentType.equals(DocumentType.REQUESTFORQUOTATION)) {
      assignInitiatorAsBuyer();
 // set some other variable unique to this type
}

private void assignInitiatorAsBuyer() {
        this.buyer = this.p1;
        this.seller = this.p2;
}
private void assignInitiatorAsSeller() {
        this.buyer = this.p2;
        this.seller = this.p1;
}
  

Или, если она используется в другом классе, используйте вот так:

 else if(documentType.equals(DocumentType.REQUESTFORQUOTATION)) {
      assignInitiatorAsBuyer(partyTypeObj);
 // set some other variable unique to this type
}

private void assignInitiatorAsBuyer(PartyTypeObjects partyTypeObj) {
        partyTypeObj.buyer = partyTypeObj.p1;
        partyTypeObj.seller = partyTypeObj.p2;
}
private void assignInitiatorAsSeller(PartyTypeObjects partyTypeObj) {
        partyTypeObj.buyer = partyTypeObj.p2;
        partyTypeObj.seller = partyTypeObj.p1;
}
  

Комментарии:

1. Во втором подходе, я думаю, у нас есть p1, p2, покупатель и продавец являются объектами типа PartyType. Они не являются членами класса Partytype, так как же мы можем написать partyType.p1, partyType.seller.

2. Спасибо!! итак, теперь я предположил, что некоторый класс, подобный partyTypeObjects , содержит p1, p2, buyer, seller, и мы можем использовать этот объект для выполнения работы, потому что согласно вопросу: все объекты (p1, p2 buyer, seller) принадлежат к одному классу, и изначально объекты buyer и seller равны нулю.

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