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

Все объекты (покупатель p1, продавец p2) относятся к одному классу, и изначально объекты покупателя и продавца равны нулю. В зависимости от типа документа мне нужно назначить 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 строки, но в противном случае, если условий много (10), чтобы уменьшить избыточность, я переместил это назначение внутрь метода. Но поскольку Java передается по значению, присвоения не отражаются в родительском методе.

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

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

JB Nizet 27.03.2019 09:05

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

Thilo 27.03.2019 09:06

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

Nidhoegger 27.03.2019 09:06

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

Joakim Danielson 27.03.2019 09:07

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

Nirojan Selvanathan 27.03.2019 09:40
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
109
2

Ответы 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;
}

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

Yashi Srivastava 27.03.2019 10:04

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

Ali Azim 27.03.2019 10:15

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

Yashi Srivastava 27.03.2019 10:20

После изменений, представленных в вопросе, я думаю, теперь мы можем перейти к подходу, при котором мы можем удалить покупателя и продавца из метода и использовать this.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;
}

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

Yashi Srivastava 27.03.2019 11:35

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

Yashi Srivastava 27.03.2019 11:41

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

Yashi Srivastava 27.03.2019 12:36

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

Joakim Danielson 27.03.2019 13:08

Другие вопросы по теме