@ অ্যামনের পরামর্শে, এখানে এমন উত্তর দেওয়া হয়েছে যা আরও ভয়াবহ। এটি একটি খুব সিদ্ধ ডাউন সংস্করণ, যেখানে আপনাকে কয়েকটি অনুমান গ্রহণ করতে হবে:
"ইউনিট" বা "রিটার্ন" ফাংশনটি ক্লাস কনস্ট্রাক্টর
"বাইন্ড" অপারেশন সংকলন সময়ে ঘটে, তাই এটি অনুরোধ থেকে লুকানো
"ক্রিয়া" ফাংশনগুলিও সংকলনের সময় ক্লাসের সাথে আবদ্ধ
যদিও ক্লাসটি জেনেরিক এবং যেকোন স্বেচ্ছাসেবী ক্লাসকে মোড়ানো, আমি মনে করি এটি আসলে এই ক্ষেত্রে অতিমাত্রায়। আপনি যা করতে পারেন তার উদাহরণ হিসাবে আমি সেভাবেই রেখে দিয়েছি।
এই বিবেচনার সাথে, মোনাড একটি সাবলীল র্যাপার ক্লাসে অনুবাদ করে (যদিও আপনি অনেকটা নমনীয়তা ছেড়ে দিচ্ছেন যা আপনি একটি সম্পূর্ণরূপে কার্যকরী ভাষায় পাবেন):
public class RepositoryLookup<E> {
private String source;
private E answer;
private Exception exception;
public RepositoryLookup<E>(String source) {
this.source = source;
}
public RepositoryLookup<E> fetchElement() {
if (answer != null) return this;
if (! exception instanceOf NotFoundException) return this;
try {
answer = lookup(source);
}
catch (Exception e) {
exception = e;
}
return this;
}
public RepositoryLookup<E> orFetchSimilarElement() {
if (answer != null) return this;
if (! exception instanceOf NotFoundException) return this;
try {
answer = lookupVariation(source);
}
catch (Exception e) {
exception = e;
}
return this;
}
public RepositoryLookup<E> orFetchParentElement() {
if (answer != null) return this;
if (! exception instanceOf NotFoundException) return this;
try {
answer = lookupParent(source);
}
catch (Exception e) {
exception = e;
}
return this;
}
public boolean failed() {
return exception != null;
}
public Exception getException() {
return exception;
}
public E getAnswer() {
// better to check failed() explicitly ;)
if (this.exception != null) {
throw new IllegalArgumentException(exception);
}
// TODO: add a null check here?
return answer;
}
}
(এটি সংকলন করবে না ... নমুনাকে ছোট রাখার জন্য নির্দিষ্ট বিশদটি অসম্পূর্ণ রেখে দেওয়া হয়েছে)
এবং অনুরোধটি দেখতে এই রকম হবে:
Repository<String> repository = new Repository<String>(x);
repository.fetchElement().orFetchParentElement().orFetchSimilarElement();
if (repository.failed()) {
throw new IllegalArgumentException(repository.getException());
}
System.err.println("Got " + repository.getAnswer());
নোট করুন যে আপনার পছন্দমতো "আনতে" ক্রিয়াকলাপ রচনার জন্য আপনার নমনীয়তা রয়েছে। কোনও উত্তর পাওয়া না গেলে বা এটি ব্যতীত অন্য কোনও ব্যতিক্রম পেলে এটি থামবে।
আমি সত্যিই এটি দ্রুত করেছি; এটি একেবারেই সঠিক নয়, তবে আশাবাদী ধারণাটি প্রকাশ করেছেন
NotFoundException
আসলে ব্যতিক্রমী কিছু কি ?