Все объекты (покупатель 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) вместо локальных переменных не вариант?
Java проходит по значению. Невозможно напрямую перейти по ссылке. Вам нужно будет обернуть свои переменные в класс, передать этот класс и установить значения внутри оболочки.
Есть ли какие-либо из четырех переменных класса объектов в классе, в который вы хотите добавить методы?
Я обновил вопрос. Все методы определены внутри класса util. Спасибо за ответы, я не смогу использовать это. тоже подход.




Если методы уже присутствуют в 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.
Спасибо!! так что теперь я предположил, что какой-то класс, например partyTypeObjects, содержит p1, p2, покупателя, продавца, и мы можем использовать этот объект для выполнения работы, потому что согласно вопросу: все объекты (p1, p2 покупатель, продавец) принадлежат к одному классу и изначально объекты покупателя и продавца равны нулю.
Кроме того, с текущими изменениями, внесенными в код в вопросе, 1-й подход также будет затронут, поскольку он содержит только покупателя и продавца в качестве членов экземпляра.
После изменений, представленных в вопросе, я думаю, теперь мы можем перейти к подходу, при котором мы можем удалить покупателя и продавца из метода и использовать 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 были переменными экземпляра, как в моем отредактированном ответе
да .. я видел это .. поэтому я изменил свой код .. мой код действителен только в том случае, если 2 переменные являются переменными экземпляра, как в моем коде.
В вопросе методы не являются статическими, но в случае, если они есть, я могу подумать об альтернативном подходе, когда мы можем заставить функцию возвращать покупателя и продавца (оба, как объект или список), и они могут быть полученный в блоке else if при вызове функции. Я также обновлю код для этого через некоторое время.
Теперь я заметил в комментарии от OP, что this в порядке, поэтому больше не нужно обновлять вопрос. Извините за весь шум :)
Не используйте покупателя и продавца в качестве аргумента. Используйте
this.buyerиthis.sellerв своих методах.