নাম গোপনে আমার একটি সমস্যা রয়েছে যা সমাধান করা অত্যন্ত কঠিন। এখানে একটি সরলীকৃত সংস্করণ যা সমস্যাটি ব্যাখ্যা করে:
একটি শ্রেণি আছে: org.A
package org;
public class A{
public class X{...}
...
protected int net;
}
তারপরে একটা ক্লাস আছে net.foo.X
package net.foo;
public class X{
public static void doSomething();
}
এবং এখন, এখানে সমস্যাযুক্ত শ্রেণি যা উত্তরাধিকার সূত্রে প্রাপ্ত Aএবং কল করতে চায়net.foo.X.doSomething()
package com.bar;
class B extends A {
public void doSomething(){
net.foo.X.doSomething(); // doesn't work; package net is hidden by inherited field
X.doSomething(); // doesn't work; type net.foo.X is hidden by inherited X
}
}
যেমন আপনি দেখতে পাচ্ছেন, এটি সম্ভব নয়। আমি সাধারণ নামটি ব্যবহার করতে পারি না Xকারণ এটি উত্তরাধিকার সূত্রে প্রাপ্ত গোপন। আমি পুরোপুরি যোগ্য নামটি ব্যবহার করতে পারি না net.foo.X, কারণ netউত্তরাধিকারসূত্রে প্রাপ্ত ক্ষেত্রের দ্বারা গোপন।
ক্লাসটি Bআমার কোড বেসে রয়েছে; ক্লাস net.foo.Xএবং org.Aলাইব্রেরি ক্লাস হয়, তাই আমি তাদের পরিবর্তন করতে পারবেন না!
আমার একমাত্র সমাধানটি এর মতো দেখাচ্ছে: আমি অন্য ক্লাসকে কল করতে পারি যা ঘুরে ফিরে কল করে X.doSomething(); তবে এই শ্রেণিটি কেবল নাম সংঘর্ষের কারণে উপস্থিত থাকবে যা খুব অগোছালো বলে মনে হচ্ছে! সেখানে কোন সমাধান যা আমি সরাসরি কল করতে পারেন X.doSomething()থেকেB.doSomething() ?
এমন একটি ভাষায় যা গ্লোবাল নেমস্পেস নির্দিষ্ট করতে দেয়, উদাহরণস্বরূপ, global::সি # বা ::সি ++ এ, আমি কেবল netএই গ্লোবাল উপসর্গের সাথে উপসর্গ করতে পারি , তবে জাভা সেটি অনুমতি দেয় না।
public void help(net.foo.X x) { x.doSomething(); }এবং সাথে কল করুনhelp(null);