একটি কাস্টম রিটার্ন টাইপ তৈরি করুন যা পরীক্ষিত ব্যতিক্রম প্রচার করবে। এটি একটি নতুন ইন্টারফেস তৈরির বিকল্প যা কার্যকরী ইন্টারফেসের পদ্ধতিতে "থ্রো ব্যতিক্রম" এর সামান্য পরিবর্তন সহ বিদ্যমান ফাংশনাল ইন্টারফেসকে আয়না করে।
সংজ্ঞা
CheckedValueSupplier
public static interface CheckedValueSupplier<V> {
public V get () throws Exception;
}
CheckedValue
public class CheckedValue<V> {
private final V v;
private final Optional<Exception> opt;
public Value (V v) {
this.v = v;
}
public Value (Exception e) {
this.opt = Optional.of(e);
}
public V get () throws Exception {
if (opt.isPresent()) {
throw opt.get();
}
return v;
}
public Optional<Exception> getException () {
return opt;
}
public static <T> CheckedValue<T> returns (T t) {
return new CheckedValue<T>(t);
}
public static <T> CheckedValue<T> rethrows (Exception e) {
return new CheckedValue<T>(e);
}
public static <V> CheckedValue<V> from (CheckedValueSupplier<V> sup) {
try {
return CheckedValue.returns(sup.get());
} catch (Exception e) {
return Result.rethrows(e);
}
}
public static <V> CheckedValue<V> escalates (CheckedValueSupplier<V> sup) {
try {
return CheckedValue.returns(sup.get());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
ব্যবহার
// Don't use this pattern with FileReader, it's meant to be an
// example. FileReader is a Closeable resource and as such should
// be managed in a try-with-resources block or in another safe
// manner that will make sure it is closed properly.
// This will not compile as the FileReader constructor throws
// an IOException.
Function<String, FileReader> sToFr =
(fn) -> new FileReader(Paths.get(fn).toFile());
// Alternative, this will compile.
Function<String, CheckedValue<FileReader>> sToFr = (fn) -> {
return CheckedValue.from (
() -> new FileReader(Paths.get("/home/" + f).toFile()));
};
// Single record usage
// The call to get() will propagate the checked exception if it exists.
FileReader readMe = pToFr.apply("/home/README").get();
// List of records usage
List<String> paths = ...; //a list of paths to files
Collection<CheckedValue<FileReader>> frs =
paths.stream().map(pToFr).collect(Collectors.toList());
// Find out if creation of a file reader failed.
boolean anyErrors = frs.stream()
.filter(f -> f.getException().isPresent())
.findAny().isPresent();
কি হচ্ছে?
একটি একক কার্যকরী ইন্টারফেস যা পরীক্ষিত ব্যতিক্রম ছুঁড়ে ফেলেছে তা তৈরি করা হয় ( CheckedValueSupplier
)। এটি একমাত্র কার্যকরী ইন্টারফেস যা পরীক্ষিত ব্যতিক্রমগুলিকে মঞ্জুরি দেয়। অন্যান্য সমস্ত ক্রিয়ামূলক ইন্টারফেসগুলি CheckedValueSupplier
এমন কোনও কোড মোড়ানোর জন্য উত্তোলন করবে যা একটি চেক করা ব্যতিক্রম ছুঁড়ে।
CheckedValue
বর্গ কোনো যুক্তি করে একটি চেক করা ব্যতিক্রম ছোঁড়ার নির্বাহ ফল রাখা হবে। কোডটি এমন কোনও বিন্দুতে যে মানটিতে অ্যাক্সেসের চেষ্টা করে সেই বিন্দু না হওয়া পর্যন্ত এটি একটি পরীক্ষিত ব্যতিক্রমের প্রচারকে বাধা দেয় CheckedValue
।
এই পদ্ধতির সাথে সমস্যাগুলি।
- আমরা এখন "ব্যতিক্রম" নিক্ষেপ করছি কার্যকরভাবে ছুঁড়ে দেওয়া নির্দিষ্ট ধরণেরটি কার্যকরভাবে লুকিয়ে।
- আমরা অজানা যে
CheckedValue#get()
ডেকে আনা পর্যন্ত একটি ব্যতিক্রম ঘটেছে ।
গ্রাহক এবং অন্যান্য
কিছু কার্যকরী ইন্টারফেস (Consumer
উদাহরণস্বরূপ) অবশ্যই কোনও ভিন্ন পদ্ধতিতে পরিচালনা করা উচিত কারণ তারা কোনও ফেরতের মান সরবরাহ করে না।
গ্রাহকের পরিবর্তে ফাংশন
একটি পদ্ধতি হ'ল গ্রাহকের পরিবর্তে কোনও ফাংশন ব্যবহার করা, যা স্ট্রিম পরিচালনা করার সময় প্রযোজ্য।
List<String> lst = Lists.newArrayList();
// won't compile
lst.stream().forEach(e -> throwyMethod(e));
// compiles
lst.stream()
.map(e -> CheckedValueSupplier.from(
() -> {throwyMethod(e); return e;}))
.filter(v -> v.getException().isPresent()); //this example may not actually run due to lazy stream behavior
ধাপে ধাপে বৃদ্ধি করা
বিকল্পভাবে, আপনি সর্বদা একটিতে আরোহণ করতে পারেন RuntimeException
। অন্যান্য উত্তরগুলি রয়েছে যা এ এর মধ্যে থেকে একটি চেক করা ব্যতিক্রমের ক্রমবৃদ্ধি coverেকে রাখেConsumer
।
গ্রাস করবেন না।
সমস্ত একসাথে কার্যকরী ইন্টারফেসগুলি এড়িয়ে চলুন এবং লুপের জন্য একটি ভাল-ওল-ফ্যাশনযুক্ত ব্যবহার করুন।