#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-й подход также будет затронут, поскольку он содержит только покупателя и продавца в качестве членов экземпляра.