আমি ল্যাম্বডাস এবং ডিফল্ট পদ্ধতি ইন্টারফেসগুলি সম্পর্কে নতুন জাভা 8 বৈশিষ্ট্যের অনেক প্রশংসা করি। তবুও, আমি এখনও পরীক্ষিত ব্যতিক্রমগুলি নিয়ে বিরক্ত হয়েছি। উদাহরণস্বরূপ, আমি যদি কেবল কোনও অবজেক্টের সমস্ত দৃশ্যমান ক্ষেত্রের তালিকা করতে চাই তবে আমি কেবল এটি লিখতে চাই:
Arrays.asList(p.getClass().getFields()).forEach(
f -> System.out.println(f.get(p))
);
তবুও, যেহেতু get
পদ্ধতিটি একটি পরীক্ষিত ব্যতিক্রম ছুঁড়ে ফেলতে পারে, যা Consumer
ইন্টারফেস চুক্তির সাথে একমত নয় , তাই আমাকে অবশ্যই এই ব্যতিক্রমটি ধরতে হবে এবং নিম্নলিখিত কোডটি লিখতে হবে:
Arrays.asList(p.getClass().getFields()).forEach(
f -> {
try {
System.out.println(f.get(p));
} catch (IllegalArgumentException | IllegalAccessException ex) {
throw new RuntimeException(ex);
}
}
);
তবে বেশিরভাগ ক্ষেত্রে আমি কেবল ব্যতিক্রমটিকে একটি হিসাবে ছুঁড়ে ফেলাতে চাই এবং সংযোগ RuntimeException
ত্রুটি ব্যতীত ব্যতিক্রমটিকে প্রোগ্রামটি পরিচালনা করতে দাও বা না।
সুতরাং, চেক করা ব্যতিক্রম বিরক্তির জন্য আমি আমার বিতর্কিত কর্মকাণ্ড সম্পর্কে আপনার মতামত রাখতে চাই। সে লক্ষ্যে, আমি একটি সহায়ক ইন্টারফেস ConsumerCheckException<T>
এবং একটি ইউটিলিটি ফাংশন তৈরি করেছি rethrow
( ডোভালের মন্তব্য অনুসারে আপডেট করা হয়েছে ):
@FunctionalInterface
public interface ConsumerCheckException<T>{
void accept(T elem) throws Exception;
}
public class Wrappers {
public static <T> Consumer<T> rethrow(ConsumerCheckException<T> c) {
return elem -> {
try {
c.accept(elem);
} catch (Exception ex) {
/**
* within sneakyThrow() we cast to the parameterized type T.
* In this case that type is RuntimeException.
* At runtime, however, the generic types have been erased, so
* that there is no T type anymore to cast to, so the cast
* disappears.
*/
Wrappers.<RuntimeException>sneakyThrow(ex);
}
};
}
/**
* Reinier Zwitserloot who, as far as I know, had the first mention of this
* technique in 2009 on the java posse mailing list.
* http://www.mail-archive.com/javaposse@googlegroups.com/msg05984.html
*/
public static <T extends Throwable> T sneakyThrow(Throwable t) {
throw (T) t;
}
}
এবং এখন আমি কেবল লিখতে পারি:
Arrays.asList(p.getClass().getFields()).forEach(
rethrow(f -> System.out.println(f.get(p)))
);
আমি নিশ্চিত নই যে চেক করা ব্যতিক্রমগুলি ঘুরিয়ে দেওয়ার জন্য এটি সর্বোত্তম পন্থা, তবে আমি যেমন বর্ণনা করেছি, চেক করা ব্যতিক্রমগুলি না নিয়েই আমার প্রথম উদাহরণ অর্জনের আরও সহজতর উপায় হতে চাই এবং এটিই আমি খুঁজে পেয়েছি যে এটি সহজ উপায় এটা করতে।
sneakyThrow
ভিতরে rethrow
মোড়ক না করে মূল, চেক ব্যতিক্রমটি ছুঁড়ে ফেলার জন্য ভিতরে ব্যবহার করতে পারেন RuntimeException
। বিকল্পভাবে আপনি প্রকল্প লম্বোক@SneakyThrows
থেকে টীকাগুলি ব্যবহার করতে পারেন যা একই কাজ করে।
Consumer
s এ forEach
যখন সমান্তরাল ব্যবহার সমান্তরাল ফ্যাশন মৃত্যুদন্ড কার্যকর করা যেতে পারে Stream
সে। গ্রাহকের সাথে যোগ দেওয়া থেকে উত্থাপিত একটি নিক্ষেপকারী কলিং থ্রেডে প্রচার করবে, যা 1) অন্য একযোগে চলমান গ্রাহকরা থামবে না, যা উপযুক্ত বা উপযুক্ত নাও হতে পারে, এবং 2) যদি একাধিক ভোক্তা কিছু ফেলে দেয় তবে কেবল থ্রোয়েবলগুলির মধ্যে একটি কলিং থ্রেড দ্বারা দেখা যাবে।