আপনি জাভাতে গ্লোবাল ভেরিয়েবল কীভাবে সংজ্ঞায়িত করবেন?
আপনি জাভাতে গ্লোবাল ভেরিয়েবল কীভাবে সংজ্ঞায়িত করবেন?
উত্তর:
গ্লোবাল ভেরিয়েবল সংজ্ঞায়িত করতে আপনি স্ট্যাটিক কীওয়ার্ড ব্যবহার করতে পারেন
public class Example {
public static int a;
public static int b;
}
এখন আপনি কল করে যে কোনও জায়গা থেকে a এবং b অ্যাক্সেস করতে পারবেন
Example.a;
Example.b;
staticযখন তাদের বর্গ লোড হয় কীওয়ার্ডটি ভেরিয়েবল বিশ্বব্যাপী অ্যাক্সেসযোগ্য করে তোলে।
Globalঅন্য কোনও কিছুর ( TestClass?) এর পরামর্শ দিচ্ছি যাতে লোকদের এমন ধারণা না দেয় যে Globalজাভা কীওয়ার্ডের মতো কোনও জিনিস রয়েছে । দুঃখিত চেয়ে ভাল নিরাপদ :)
আপনি না। এটা নকশা দ্বারা। পারলেও আপনার করা উচিত নয়।
বলা হচ্ছে আপনি গ্লোবালস নামের একটি শ্রেণিতে পাবলিক স্ট্যাটিক সদস্যদের একটি সেট তৈরি করতে পারেন।
public class Globals {
public static int globalInt = 0;
///
}
তবে আপনার আসলেই উচিত নয় :)। সিরিয়াসলি .. এটা করবেন না।
আর একটি উপায় হল এর মতো ইন্টারফেস তৈরি করা:
public interface GlobalConstants
{
String name = "Chilly Billy";
String address = "10 Chicken head Lane";
}
যে কোনও শ্রেণীর যেগুলি তাদের ব্যবহার করতে হবে কেবল ইন্টারফেস প্রয়োগ করতে হবে:
public class GlobalImpl implements GlobalConstants
{
public GlobalImpl()
{
System.out.println(name);
}
}
নির্ভরতা ইনজেকশন ব্যবহার করা থেকে আপনি ভাল:
public class Globals {
public int a;
public int b;
}
public class UsesGlobals {
private final Globals globals;
public UsesGlobals(Globals globals) {
this.globals = globals;
}
}
প্রচুর ভাল উত্তর, তবে আমি এই উদাহরণটি দিতে চাই কারণ এটি অন্য শ্রেণীর দ্বারা শ্রেণীর ভেরিয়েবলগুলি অ্যাক্সেস করার আরও সঠিক উপায় হিসাবে বিবেচিত: গেটরস এবং সেটটারগুলি ব্যবহার করে।
আপনি কেবল পরিবর্তনশীলগুলি সর্বজনীন করার পরিবর্তে এইভাবে গেটার এবং সেটটারগুলি ব্যবহার করার কারণটি নিম্নরূপ। আসুন আমরা বলতে পারি যে আপনার ভার্সনটি একটি বিশ্বব্যাপী প্যারামিটার হতে চলেছে যা আপনি কখনই চান না যে আপনার প্রোগ্রামটি কার্যকর করার সময় কেউ পরিবর্তন করতে চান (যখন আপনি একটি দলের সাথে কোড তৈরি করছেন তখন), ওয়েবসাইটটির URL এর মতো কিছু। তত্ত্বগতভাবে এটি পরিবর্তিত হতে পারে এবং আপনার প্রোগ্রামে এটি বেশ কয়েকবার ব্যবহৃত হতে পারে, তাই আপনি একবারে এটি আপডেট করতে সক্ষম হয়ে বিশ্বব্যাপী বিভিন্ন ব্যবহার করতে চান। তবে আপনি চান না যে অন্য কেউ varুকে এই ভেরটি পরিবর্তন করুন (সম্ভবত এটি কতটা গুরুত্বপূর্ণ তা বুঝতে না পেরে)। সেক্ষেত্রে আপনি কেবল একটি সেটার পদ্ধতি অন্তর্ভুক্ত করবেন না এবং কেবল গেটর পদ্ধতি অন্তর্ভুক্ত করবেন।
public class Global{
private static int var = 5;
public static int getVar(){
return Global.var;
}
//If you do not want to change the var ever then do not include this
public static void setVar(int var){
Global.var = var;
}
}
জাভাতে কোনও বৈশ্বিক পরিবর্তনশীল নেই
তবুও, আমাদের যা আছে তা একটি staticমূলশব্দ এবং এটি আমাদের প্রয়োজন। জাভাতে শ্রেণীর বাইরে কিছু নেই। দ্যstaticশব্দ একটি বর্গ পরিবর্তনশীল যে, উদাহরণস্বরূপ পরিবর্তনশীল বিপরীত শুধু একটি কপি এবং তৈরি করে ক্লাসের সব দৃষ্টান্ত, যার মানে এর মান যেকোনো সময়ে পরিবর্তন করা যাবে এবং অ্যাক্সেস সমস্ত উদাহরণ জুড়ে জুড়ে যে ছাড়িয়ে গেছে প্রতিনিধিত্ব করে।
আপনার যদি এমন একটি বৈশ্বিক পরিবর্তনশীল প্রয়োজন হয় যা স্কোপগুলি ছাড়িয়ে অ্যাক্সেস করা যায়, তবে এটি আপনার প্রয়োজনীয় পরিবর্তনশীল তবে তার স্কোপটি কেবল যেখানে শ্রেণি রয়েছে সেখানে উপস্থিত রয়েছে এবং এটি সমস্ত হবে।
সত্যিই বলতে গেলে জাভা ওও প্রোগ্রামে "গ্লোবাল" ধারণা নেই
তবুও আপনার প্রশ্নের পিছনে কিছু সত্য রয়েছে কারণ এমন কিছু ঘটনা ঘটবে যেখানে আপনি প্রোগ্রামের যে কোনও অংশে কোনও পদ্ধতি চালাতে চান। উদাহরণস্বরূপ --- বাক্যাংশ-ও-ম্যাটিক অ্যাপ্লিকেশনটিতে এলোমেলো () পদ্ধতি; এটি এমন একটি পদ্ধতি যা প্রোগ্রামের যে কোনও জায়গা থেকে কল করতে হবে।
সুতরাং উপরের মত জিনিসগুলি সন্তুষ্ট করার জন্য "আমাদের গ্লোবাল-মতো পরিবর্তনশীল এবং পদ্ধতি থাকা দরকার"
গ্লোবাল হিসাবে একটি বৈকল্পিক ঘোষণা করার জন্য।
1.Mark the variable as public static final While declaring.
গ্লোবাল হিসাবে একটি পদ্ধতি ঘোষণা ।
1. Mark the method as public static While declaring.
কারণ আমি বিশ্বব্যাপী ভেরিয়েবল এবং পদ্ধতিটিকে স্থিতিশীল হিসাবে ঘোষণা করেছিলাম নীচের কোডটির সাহায্যে আপনি যে কোনও জায়গায় কল করতে পারেন
ClassName.X
দ্রষ্টব্য : এক্স প্রয়োজন অনুসারে পদ্ধতির নাম বা পরিবর্তনশীল নাম হতে পারে এবং ক্লাসনেম আপনি যে শ্রেণিতে তাদের ঘোষনা করেছিলেন সেটির নাম।
ধ্রুবক ছাড়া কিছু গ্লোবাল হওয়া উচিত না।
public class MyMainClass {
public final static boolean DEBUGMODE=true;
}
এটি আপনার প্রধান শ্রেণীর মধ্যে রাখুন। অন্যান্য। জাভা ফাইলগুলিতে এটি ব্যবহার করুন:
if(MyMainClass.DEBUGMODE) System.out.println("Some debugging info");
আপনি যখন নিজের কোডটি কাটিং রুমের মেঝে থেকে সরানোর সময় এবং মুক্তির সময় সরিয়ে ফেলবেন বা এই কার্যকারিতাটি মন্তব্য করবেন তা নিশ্চিত করুন।
যদি আপনার একটি ওয়ার্কহর্স পদ্ধতি থাকে তবে কোনও র্যান্ডমাইজারের মতো, আমি একটি "টুলবক্স" প্যাকেজ তৈরির পরামর্শ দিচ্ছি! সমস্ত কোডারের একটি হওয়া উচিত, তারপরে আপনি যখনই এটি জাভাতে ব্যবহার করতে চান, কেবল এটি আমদানি করুন!
জাভাতে সত্যিকারের গ্লোবাল ভেরিয়েবলের মতো জিনিস নেই। প্রতিটি স্ট্যাটিক ভেরিয়েবল অবশ্যই কিছু শ্রেণীর (যেমন সিস্টেম.আউট) এর অন্তর্ভুক্ত থাকে তবে আপনি কোন শ্রেণিতে প্রবেশ করবেন তা স্থির করে নেওয়ার পরে আপনি একই শ্রেণি লোডার দ্বারা লোড হওয়া সর্বত্র থেকে এটিকে উল্লেখ করতে পারেন।
নোট করুন যে স্থির ভেরিয়েবলগুলি সর্বদা জাতির পরিস্থিতি এড়াতে আপডেট করার সময় সুরক্ষিত থাকা উচিত।
public class GlobalClass {
public static int x = 37;
public static String s = "aaa";
}
এই ভাবে আপনি তাদের সাথে অ্যাক্সেস করতে পারেন GlobalClass.xএবংGlobalClass.s
public class GlobalImpl {
public static int global = 5;
}
আপনি যে কোনও জায়গায় কল করতে পারেন:
GlobalImpl.global // 5
আপনি সম্ভবত উত্তরটি থেকে অনুমান করেছিলেন যে জাভাতে কোনও বৈশ্বিক চলক নেই এবং কেবলমাত্র আপনি যা করতে পারেন তা হ'ল স্থির সদস্যদের সাথে একটি শ্রেণি তৈরি করা:
public class Global {
public static int a;
}
আপনি এটি Global.aঅন্য কোথাও ব্যবহার করতে পারেন । তবে আপনি যদি জাভা 1.5 ব্যবহার করেন বা আরও ভাল ব্যবহার করেন তবে import staticযাদুটিকে এটি বাস্তব বৈশ্বিক পরিবর্তনশীল হিসাবে আরও বেশি দেখানোর জন্য ব্যবহার করতে পারেন :
import static test.Global.*;
public class UseGlobal {
public void foo() {
int i = a;
}
}
ও ভয়েল !
এখন এটি একটি সেরা অনুশীলন থেকে অনেক দূরে তাই আপনি বিজ্ঞাপনে দেখতে পারেন: ঘরে এটি করবেন না
জাভাতে কোনও গ্লোবাল ভেরিয়েবল নেই, তবে সর্বজনীন ক্ষেত্রগুলি সহ বিশ্বব্যাপী ক্লাস রয়েছে। এটি প্রায় বিশ্বব্যাপী ভেরিয়েবলের মতো দেখানোর জন্য আপনি জাভা 5 এর স্ট্যাটিক আমদানি বৈশিষ্ট্যটি ব্যবহার করতে পারেন।
সাধারণত গ্লোবাল ভেরিয়েবল (আমি ধরে নিচ্ছি আপনি এটি সি, সিপিসির সাথে তুলনা করছেন) হিসাবে সংজ্ঞায়িত করুন public static final
মত
class GlobalConstant{
public static final String CODE = "cd";
}
ENUM গুলি এ জাতীয় দৃশ্যেও দরকারী:
উদাহরণস্বরূপ Calendar.JANUARY)
finalতবে এটি অবশ্যই নির্ভর করে আপনি কীভাবে ভাগ করতে চান, কোথায় আপনি এবং সমস্ত ব্যবহার করছেন
CODEএই উদাহরণে কি ধরণের ? এটি সংজ্ঞায়িত কোথায়?
একটি স্বাধীন ফাইল তৈরি করা, যেমন eg উদাহরণ.জভা 1 ম সমাধানটি ব্যবহার করার জন্য, ঠিক আছে। আপনি যদি অ্যাপ্লিকেশনটির মধ্যেও এটি করতে পারেন, যেমন বিশ্বব্যাপী ভেরিয়েবলগুলি আপনার বর্তমান অ্যাপ্লিকেশন ইত্যাদির জন্য বিশেষ etc
শুরুতে একটি ক্লাস তৈরি করুন এবং সেখানে আপনার ভেরিয়েবলগুলি ঘোষণা করুন:
class Globals {
static int month_number;
static String month_name;
}
তারপরে আপনি এই ভেরিয়েবলগুলি অ্যাক্সেস করতে পারেন - এগুলিকে 'গ্লোবালস.মনেথ_নম্বার' ইত্যাদি হিসাবে ব্যবহার করে - আপনার অ্যাপের অ্যাভারিও থেকে।
আপনার যদি বৈশ্বিক সম্পত্তি আপডেট করার দরকার পড়ে তবে একটি সাধারণ গেটর / সেটার র্যাপার ক্লাস গ্লোবাল ভেরিয়েবল হিসাবে ব্যবহার করা যেতে পারে। একটি সাধারণ উদাহরণ নীচে প্রদর্শিত হয়।
public class GlobalHolder {
private static final GlobalHolder INSTANCE = new GlobalHolder();
private volatile int globalProperty;
public static GlobalHolder getInstance() {
return INSTANCE;
}
public int getGlobalProperty() {
return globalProperty;
}
public void setGlobalProperty(int globalProperty) {
this.globalProperty = globalProperty;
}
public static void main(String[] args) {
GlobalHolder.getInstance().setGlobalProperty(10);
System.out.println(GlobalHolder.getInstance().getGlobalProperty());
}
}
ধারণাটি অনুসরণ করে গ্লোবাল ভেরিয়েবলগুলি, উদাহরণস্বরূপ ভেরিয়েবল হিসাবে পরিচিত, এটি শ্রেণীর স্তরের ভেরিয়েবলগুলি, অর্থাত তারা শ্রেণীর ভিতরে কিন্তু বাইরের পদ্ধতির মধ্যে সংজ্ঞায়িত হয়। যাতে তাদের সম্পূর্ণ উপলব্ধ হয় এবং তাদের সরাসরি স্ট্যাটিক কীওয়ার্ড সরবরাহ করতে ব্যবহার করুন। সুতরাং আমি যদি সাধারণ গাণিতিক ক্রিয়াকলাপের জন্য কোনও প্রোগ্রাম লিখছি এবং এর জন্য একটি সংখ্যা জোড় প্রয়োজন হয় তবে দুটি উদাহরণ ভেরিয়েবলের সংজ্ঞা দেওয়া হয়:
public class Add {
static int a;
static int b;
static int c;
public static void main(String arg[]) {
c=sum();
System.out.println("Sum is: "+c);
}
static int sum() {
a=20;
b=30;
return a+b;
}
}
Output: Sum is: 50
উদাহরণস্বরূপ ভেরিয়েবলের পূর্বে স্থির কীওয়ার্ড ব্যবহার করে আমাদের বারবার একই ভেরিয়েবলের জন্য ডেটাটাইপগুলি নির্দিষ্ট না করতে সক্ষম করে। কেবল ভেরিয়েবল সরাসরি লিখুন।
staticসম্পূর্ণরূপে উপলব্ধ করে না এমন হিসাবে তাদের সংজ্ঞা দেওয়া । প্রথম অনুচ্ছেদে বাজে কথা। উদাহরণ হ'ল দুর্বল অনুশীলন।
সাধারণভাবে, জাভাতে কোনও বৈশ্বিক চলক নেই। স্থানীয় ভেরিয়েবল ব্যতীত, সমস্ত ভেরিয়েবল প্রোগ্রামে সংজ্ঞায়িত যে কোনও শ্রেণির আওতায় আসে। গ্লোবাল ভেরিয়েবলের সুযোগ থাকতে আমাদের স্ট্যাটিক ভেরিয়েবল থাকতে পারে।
এটি ছাড়াও staticসম্ভব:
class Main {
String globalVar = "Global Value";
class Class1 {
Class1() {
System.out.println("Class1: "+globalVar);
globalVar += " - changed";
} }
class Class2 {
Class2() {
System.out.println("Class2: "+globalVar);
} }
public static void main(String[] args) {
Main m = new Main();
m.mainCode();
}
void mainCode() {
Class1 o1 = new Class1();
Class2 o2 = new Class2();
}
}
/*
Output:
Class1: Global Value
Class2: Global Value - changed
*/
অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংটি বোঝার সাথে বোঝানো হয়েছে যে ভেরিয়েবলের সুযোগটি সেই ভেরিয়েবলগুলিকে আবদ্ধ করে এমন শ্রেণীর অবজেক্টের সাথে একত্রে একচেটিয়া।
"গ্লোবাল ভেরিয়েবল" তৈরি করতে সমস্যা হ'ল এটি জাভার জন্য শিল্প মান নয়। এটি শিল্পের স্ট্যান্ডার্ড নয় কারণ এটি একাধিক ক্লাসগুলিকে অ্যাসক্রোনাইজড ডেটা ম্যানিপুলেট করার অনুমতি দেয়, আপনি যদি একাধিক থ্রেডযুক্ত অ্যাপ্লিকেশন চালাচ্ছেন তবে থ্রেড-সুরক্ষার দিক থেকে এটি কিছুটা জটিল এবং বিপজ্জনক হয়ে উঠবে। আছে বিভিন্ন অন্যান্য কারণের কেন গ্লোবাল ভেরিয়েবল অকার্যকর হয় ব্যবহার করে, কিন্তু যদি আপনি যে এড়াতে চান, আমি আপনাকে অবলম্বন সুপারিশ অ্যাসপেক্ট ওরিয়েন্টেড প্রোগ্রামিং ।
দিক-ওরিয়েন্টেড প্রোগ্রামিং "পরামর্শ" নামক কোনও কিছুর মাধ্যমে পিতামাতা শ্রেণিকে দায়িত্বে রেখে এই সমস্যাটিকে তুচ্ছ করে তোলে, যা কোডটিতে আসলে এটি পরিবর্তন না করে অতিরিক্ত আচরণ যুক্ত করে। এটি ক্রস কাটিয়া উদ্বেগ, বা বৈশ্বিক পরিবর্তনশীল ব্যবহারের সমাধান সরবরাহ করে।
স্প্রিং একটি জাভা ফ্রেমওয়ার্ক যা এওপি ব্যবহার করে এবং এটি ওয়েব-অ্যাপ্লিকেশনগুলির জন্য traditionতিহ্যগতভাবে ব্যবহৃত হয়, মূল অ্যাপ্লিকেশনটি জাভা ফ্রেমওয়ার্ক জুড়ে সর্বজনীনভাবে ব্যবহার করা যেতে পারে (8.0 অন্তর্ভুক্ত)। এটি হয়ত আপনাকে আরও অন্বেষণ করতে চান এমন এক দিক হতে পারে।
আমি গ্লোবাল ভেরিয়েবলের যোগ্যতাটিকে একটি পরিবর্তনশীল হিসাবে বিবেচনা করি যা স্থির / উদাহরণস্বরূপ কল সম্পর্কে যত্ন না নিয়ে বা কোনও শ্রেণি থেকে অন্য শ্রেণিতে কোনও রেফারেন্স ছাড়াই কোডের যে কোনও জায়গায় প্রবেশ এবং পরিবর্তন করা যায়।
সাধারণত আপনার যদি ক্লাস এ থাকে
public class A {
private int myVar;
public A(int myVar) {
this.myVar = myVar;
}
public int getMyVar() {
return myVar;
}
public void setMyVar(int mewVar) {
this.myVar = newVar;
}
}
এবং myvarএকটি ক্লাস বিতে অ্যাক্সেস এবং আপডেট করতে চান ,
public class B{
private A a;
public void passA(A a){
this.a = a;
}
public void changeMyVar(int newVar){
a.setMyvar(newVar);
}
}
আপনার ক্লাস এ এর উদাহরণের একটি রেফারেন্স থাকতে হবে এবং বি শ্রেণিতে মানটি আপডেট করতে হবে:
int initialValue = 2;
int newValue = 3;
A a = new A(initialValue);
B b = new B();
b.passA(a);
b.changeMyVar(newValue);
assertEquals(a.getMyVar(),newValue); // true
সুতরাং এটির আমার সমাধান, (যদিও এটি নিশ্চিত না হলেও এটি একটি ভাল অনুশীলন), একটি সিঙ্গলটন ব্যবহার করা:
public class Globals {
private static Globals globalsInstance = new Globals();
public static Globals getInstance() {
return globalsInstance;
}
private int myVar = 2;
private Globals() {
}
public int getMyVar() {
return myVar;
}
public void setMyVar(int myVar) {
this.myVar = myVar;
}
}
এখন আপনি গ্লোবাল অনন্য উদাহরণটি যে কোনও জায়গায় পেতে পারেন:
Globals globals = Globals.getInstance();
// and read and write to myVar with the getter and setter like
int myVar = globals.getMyVar();
global.setMyVar(3);
// Get the access of global while retaining priveleges.
// You can access variables in one class from another, with provisions.
// The primitive must be protected or no modifier (seen in example).
// the first class
public class farm{
int eggs; // an integer to be set by constructor
fox afox; // declaration of a fox object
// the constructor inits
farm(){
eggs = 4;
afox = new fox(); // an instance of a fox object
// show count of eggs before the fox arrives
System.out.println("Count of eggs before: " + eggs);
// call class fox, afox method, pass myFarm as a reference
afox.stealEgg(this);
// show the farm class, myFarm, primitive value
System.out.println("Count of eggs after : " + eggs);
} // end constructor
public static void main(String[] args){
// instance of a farm class object
farm myFarm = new farm();
}; // end main
} // end class
// the second class
public class fox{
// theFarm is the myFarm object instance
// any public, protected, or "no modifier" variable is accessible
void stealEgg(farm theFarm){ --theFarm.eggs; }
} // end class
গ্লোবাল ভেরিয়েবল সংজ্ঞায়িত করতে আপনি স্ট্যাটিক কীওয়ার্ড ব্যবহার করতে পারেন
public final class Tools {
public static int a;
public static int b;
}
এখন আপনি কল করে যে কোনও জায়গা থেকে a এবং b অ্যাক্সেস করতে পারবেন
Tools.a;
Tools.b;
আপনি ঠিক বলেছেন ... বিশেষত জে 2 এমইতে ... আপনি এই মিডলিট কনস্ট্রাক্টরের ভিতরে প্রবেশের মাধ্যমে নলপয়েন্টারএক্সেপশন এড়াতে পারবেন (প্রগতি সূচনা) কোডটির এই লাইন:
new Tools();
এটি নিশ্চিত করে যে সরঞ্জামগুলি ব্যবহার করে এমন কোনও নির্দেশের আগে বরাদ্দ দেওয়া হবে।
এটাই!