ग्राहक वर्ग कंस्ट्रक्टर इंजेक्शन का उपयोग करता है (फ़ील्ड इंजेक्शन पर अनुशंसित), लेकिन इंस्टेंस फ़ील्ड लैम्ब्डा के अंदर प्रयोग करने योग्य नहीं है।

@Component
public class Customer {

  private final Account account;

  @Autowired
  public Customer(final Account account) {
    this.account = account;
  }

  // Works perfectly fine
  Callable propCallable = new Callable<String>(){
    @Override
    public String call() throws Exception {
        return account.accountId();
    }
  };

  //Shows warning : Variable account might not have been initialized
  Callable lambdaCallable = () -> {
    return account.accountId();
  };
}

मैं सिर्फ यह जानने के लिए उत्सुक हूं कि क्या अनाम वर्ग के बजाय लैम्ब्डा के अंदर आवृत्ति चर का उपयोग करने का कोई बेहतर तरीका है?

नोट: मैं खाते को अंतिम रूप में रखना पसंद करता हूं।

अग्रिम में धन्यवाद

1
technoJ 22 फरवरी 2019, 12:53

2 जवाब

सबसे बढ़िया उत्तर

अनाम वर्ग और लैम्ब्डा के बीच कुछ अंतर हैं . इस मामले में मुख्य है:

संकलन - बेनामी एक वर्ग के लिए संकलित करता है, जबकि लैम्ब्डा एक इनवोकडायनामिक निर्देश है

अब संकलक त्रुटि के बारे में। जावा ऑर्डर ऑफ इनिशियलाइज़ेशन रूल्स द्वारा, आपका लैम्ब्डा इनिशियलाइज़ेशन 'खाता' से पहले होता है। कंस्ट्रक्टर में असाइनमेंट। निश्चित नहीं है, लेकिन संकलन अंतर के कारण अनाम वर्ग के साथ ऐसी कोई त्रुटि नहीं है।

तो, आप लैम्ब्डा को विधि से वापस कर सकते हैं, या 'lambdaCallable' इनिशियलाइज़ेशन को कंस्ट्रक्टर में स्थानांतरित कर सकते हैं।

public class DemoApplication {

    public class Customer {

        private final Account account;

        public Customer(final Account account) {
            this.account = account;
        }

        // Works perfectly fine
        Callable propCallable = new Callable<String>(){
            @Override
            public String call() throws Exception {
                return account.accountId();
            }
        };

        Callable getCallable() {
            return account::getId;
        }

//        Callable lambdaCallable = () -> {
//            return account.accountId();
//        };
    }
}
2
ilinykhma 22 फरवरी 2019, 15:33

lambdaCallable परिभाषा को कंस्ट्रक्टर के अंदर ले जाएं:

private final Callable<Long> lambdaCallable;
@Autowired
public Customer(final Novel account) {
   this.account = account;
   lambdaCallable = account::getId;
}
1
Mạnh Quyết Nguyễn 22 फरवरी 2019, 13:14