স্থির পদ্ধতিগুলি কেবল স্থির ডেটা ব্যবহার করতে পারে কেন?


38

আমি বুঝতে পারি না কেন একটি স্ট্যাটিক পদ্ধতি অ স্থির ডেটা ব্যবহার করতে পারে না। সমস্যাগুলি কি কেউ ব্যাখ্যা করতে পারে এবং কেন আমরা এটি করতে পারি না?


11
কারণ স্থির পদ্ধতির দৃষ্টিকোণ থেকে কেবল স্থিতিশীল ডেটা বিদ্যমান।
mouviciel

4
আপনার গবেষণা ভাগ করে নেওয়া প্রত্যেককে সহায়তা করে। আপনি কী চেষ্টা করেছেন এবং কেন এটি আপনার প্রয়োজনীয়তা মেটেনি তা আমাদের বলুন। এটি প্রমাণ করে যে আপনি নিজেকে সাহায্য করার চেষ্টা করার জন্য সময় নিয়েছেন, এটি আমাদের সুস্পষ্ট উত্তরের পুনরাবৃত্তি থেকে বাঁচায় এবং সর্বোপরি এটি আপনাকে আরও নির্দিষ্ট এবং প্রাসঙ্গিক উত্তর পেতে সহায়তা করে get কীভাবে জিজ্ঞাসা করতে হবে
gnat

19
এই ক্ষেত্রে @gnat একটি ডিজাইনের সিদ্ধান্তের পিছনে কারণটি বোঝার চেষ্টা করছে ওপি। এক্ষেত্রে আপনি কী চেষ্টা করবেন বলে আপনি আশা করেন?
গীক

2
@ গীক - স্থির পদ্ধতির অস্তিত্ব, স্ট্যাটিক ডেটা একটি ভাষা নকশা সমস্যা। মানক অর্থ ধরে নেওয়া, স্থির পদ্ধতিগুলি উদাহরণ ডেটা অ্যাক্সেস করতে পারে না তা এই নয়। সীমাবদ্ধতা সংজ্ঞায়িত দ্বারা সংজ্ঞায়িত করা হয় এবং কী কী সম্ভব এবং অর্থবোধ করে, কিছু ভাষা ডিজাইনারদের দ্বারা এটি অসম্পূর্ণ নয়।
স্টিভ 314

6
জের্ট্রুড স্টেইনকে প্যারাফ্রেস করতে: "এখানে এটি নেই।"
হিপ্পো-নর্তকী

উত্তর:


73

বেশিরভাগ ওও ভাষায়, আপনি যখন শ্রেণীর ভিতরে কোনও পদ্ধতি সংজ্ঞায়িত করেন, এটি একটি ইনস্ট্যান্স পদ্ধতি হয়ে যায় । আপনি যখন কীওয়ার্ডের মাধ্যমে class শ্রেণীর একটি নতুন উদাহরণ তৈরি করেন new, আপনি কেবলমাত্র সেই উদাহরণটির জন্য অনন্য একটি নতুন সেট শুরু করেন। সেই উদাহরণের সাথে সম্পর্কিত পদ্ধতিগুলি তারপরে আপনি যে ডেটাটি সংজ্ঞায়িত করেছেন তার সাথে কাজ করতে পারে।

স্থিতিশীল পদ্ধতিগুলি বিপরীতে, পৃথক শ্রেণীর উদাহরণগুলি সম্পর্কে অজ্ঞ। স্ট্যাটিক পদ্ধতিটি সি বা সি ++ তে একটি ফ্রি ফাংশনের অনুরূপ। এটি শ্রেণীর নির্দিষ্ট ইনস্ট্যান্টেশনের সাথে আবদ্ধ নয়। এ কারণেই তারা উদাহরণের মানগুলিতে অ্যাক্সেস করতে পারে না। এর থেকে কোনও মূল্য নেওয়ার উদাহরণ নেই!

স্ট্যাটিক ডেটা স্থির পদ্ধতির মতো। যে মানটি ঘোষিত হয় staticতার কোনও সম্পর্কিত উদাহরণ নেই। এটি প্রতিটি উদাহরণের জন্য উপস্থিত রয়েছে এবং কেবলমাত্র স্মৃতিতে একক স্থানে ঘোষিত হয়। যদি এটি কখনও পরিবর্তিত হয়, তবে এটি শ্রেণীর প্রতিটি উদাহরণের জন্য পরিবর্তিত হবে।

একটি স্ট্যাটিক পদ্ধতি স্ট্যাটিক ডেটা অ্যাক্সেস করতে পারে কারণ সেগুলি উভয়ই শ্রেণীর নির্দিষ্ট দৃষ্টান্তের সাথে স্বাধীনভাবে বিদ্যমান।

উদাহরণস্বরূপ পদ্ধতির তুলনায় আপনি কীভাবে স্থিতিশীল পদ্ধতিতে প্রার্থনা করছেন তা দেখতে এটির সহায়তা হতে পারে। ধরা যাক আমাদের নিম্নলিখিত ক্লাসটি ছিল (জাভা-এর মতো সিউডোকোড ব্যবহার করে):

class Foo {
    // This static value belongs to the class Foo
    public static final string name = "Foo";

    // This non-static value will be unique for every instance
    private int value;

    public Foo(int value) {
         this.value = value;
    }

    public void sayValue() {
        println("Instance Value: " + value);
    }

    public static void sayName() {
        println("Static Value: " + name);
    }
}

Foo foo1 = new Foo(10);
Foo foo2 = new Foo(20);

foo1.sayValue(); // Prints "Instance Value: 10" - called on foo1
foo2.sayValue(); // Prints "Instance Value: 20" - called on foo2

Foo.sayName(); // Prints "Static Value: Foo" - called on Foo (not foo1 or foo2)

হালনাগাদ

হিসাবে থেকে আসা মন্তব্যের আউট পয়েন্ট, একটি স্ট্যাটিক পদ্ধতি হল অ স্ট্যাটিক ডাটা সঙ্গে কাজ করতে সক্ষম, কিন্তু এটি স্পষ্টভাবে পাস করতে হবে। ধরে নেওয়া যাক Fooক্লাসের আরও একটি পদ্ধতি ছিল:

public static Foo Add(Foo foo1, Foo foo2) {
    return new Foo(foo1.value + foo2.value);
}

Addএখনও অচল এবং valueএর নিজস্ব কোনও উদাহরণ নেই , তবে ফু ক্লাসের সদস্য হওয়ার valueকারণে এটি পাস-ইন foo1এবং foo2দৃষ্টান্তগুলির ব্যক্তিগত ক্ষেত্রগুলি অ্যাক্সেস করতে পারে । এই ক্ষেত্রে, আমরা উভয় পাস-ইন হওয়া মানগুলির যুক্ত হওয়া মানগুলির সাথে একটি নতুন ফিরিয়ে আনতে এটি ব্যবহার করছি Foo

Foo foo3 = Foo.Add(foo1, foo2); // creates a new Foo with a value of 30

30
"এর থেকে কোনও মূল্য নেওয়ার কোনও উদাহরণ নেই" এ প্রসারিত করে - উদাহরণ থাকলেও স্থির পদ্ধতিটি কোন উদাহরণটি থেকে কোনও মূল্য নেওয়া উচিত তা জানতে পারে না ।
স্টিভ 314

9
এটি এমন ভাষাগুলিতে ব্যাখ্যা করা খুব কম জটিল যেগুলি সবকিছুকে ডিফল্টরূপে কোনও বস্তুর অংশ হতে বাধ্য করে না।
ম্যাসন হুইলার

3
@ মিথুন সত্য শব্দ। জাভা জাতীয় ভাষার মত একটি মিথ্যা ধারণা প্রয়োগ করে যে একটি ফাংশন এমন কিছু যা প্রয়োজনীয়ভাবে একটি শ্রেণীর অন্তর্গত।
কেচালাক্স

5
এটি একটি উত্তম উত্তর তবে এটি এখনও পুরো সত্যটি বলতে ব্যর্থ: স্থির পদ্ধতিগুলি অ স্থিতিশীল ডেটা অ্যাক্সেস করতে পারে । তাদের কাছে কেবল অন্তর্নিহিত বস্তু বা- thisরেফারেন্স উপলব্ধ নেই। আমি মনে করি যে এটি বুঝতে গুরুত্বপূর্ণ।
থেকে আসুন

2
@ COMEFROM আপনি সুস্পষ্টভাবে পাসিং বলতে চান? আমি যদি আপনাকে সঠিকভাবে বুঝতে পারি তবে আমি এটির একটি নোট তৈরি করতে পারি। আমি ধরে নিয়েছি যে এটি বোঝানো হয়েছিল যে কোনও স্থির পদ্ধতি স্পষ্টভাবে অ অ স্থির ডেটা অ্যাক্সেস করতে পারে, এটি প্রদত্ত যে কোনও ফাংশন এতে স্পষ্টভাবে পাস করা ডেটাতে কাজ করতে পারে।
কেচালাক্স

22

অনুমানমূলক নমুনা দিয়ে এটি ব্যাখ্যা করি।

একটি সাধারণ শ্রেণীর কল্পনা করুন:

class User
{
User(string n) { name = n; };
string name;
}

এখন আমরা এই শ্রেণীর 2 টি উদাহরণ তৈরি করি:

User Bones = new User("Bones");
User Jim = new User("Jim");

এখন, ভাবুন - যদি আমরা ব্যবহারকারীর সাথে একটি নতুন স্থিতিশীল পদ্ধতি যুক্ত করি, যেমন:

static string GetName();

এবং আপনি এটি কল:

string x = User::GetName()

এক্স কি থাকবে? "জিম", "হাড়", বা অন্য কিছু?

সমস্যাটি হ'ল স্থির পদ্ধতিটি একটি একক পদ্ধতি যা ক্লাসে সংজ্ঞায়িত হয়, বস্তুগুলিতে নয়। ফলস্বরূপ, আপনি জানেন না এটি কোন বস্তুর জন্য প্রয়োগ হতে পারে। এ কারণেই এটি একটি বিশেষ জিনিস। স্থিতিশীল পদ্ধতিগুলি পৃথক জিনিস হিসাবে বিবেচনা করা সর্বোত্তম, উদাহরণস্বরূপ সি এর ফাংশনগুলির মতো। জাভা জাতীয় ভাষাগুলি তাদের ক্লাসের অভ্যন্তরে অন্তর্ভুক্ত থাকার বিষয়টি মূলত জাভাতে কোনও শ্রেণীর বাইরে কিছু থাকার অনুমতি না দেওয়ার সাথে সমস্যা, তাই এর মতো ফাংশনগুলি কোনও উপায়ে কোনও শ্রেণির অভ্যন্তরে বাধ্য করাতে হবে (কিছুটা কীভাবে প্রধান হতে বাধ্য হয়) এর মতো শ্রেণীর ভিতরেও যখন সমস্ত জ্ঞান এটি বলে যে এটি একটি একক, একক ফাংশন হওয়া উচিত)।


2

অ স্থির ডেটা শ্রেণীর উদাহরণের সাথে সম্পর্কিত। স্ট্যাটিক পদ্ধতি (এবং ডেটা) শ্রেণীর কোনও নির্দিষ্ট উদাহরণের সাথে সম্পর্কিত নয়। কোনও শ্রেণীর স্ট্যাটিক পদ্ধতি ব্যবহার করার জন্য এটির উদাহরণ থাকতে হবে না। উদাহরণস্বরূপ (গুলি) থাকলেও জাভার গ্যারান্টি দেওয়ার কোনও উপায় থাকবে না যে আপনি যখন স্ট্যাটিক পদ্ধতিতে কল করবেন তখন যে প্রত্যাশা আপনি করছেন তার উপর নির্ভর করে operating অতএব, স্থির পদ্ধতিতে অ স্থির ডেটা অ্যাক্সেস থাকতে পারে না।


2

এটি ক্ষেত্রের ডেটা ব্যবহার করতে পারে; নিম্নলিখিত জাভা কোড বিবেচনা করুন:

class MyBean {
    private String myString;

    static void myStaticMethod() {
        myString = "tada";/*not allowed; if this was possible how would 
                           be different from a field without static?*/

        MyBean myBean = new MyBean();//allowed if associated with an instance
        myBean.myString = "tada";
    }
}

যদিও এটি অ-স্থিতিশীল ডেটা ব্যবহার করে প্রযুক্তিগতভাবে স্থিতিশীল পদ্ধতি হতে পারে তবে এটি বিন্দুটি মিস করে। অবশ্যই আপনি একটি নতুন উদাহরণ তৈরি করতে এবং এটি অ্যাক্সেস করতে পারেন। তবে staticনেসের সাথে কিছুই করার নেই ।
ববসন

2
আসলে, আমি মনে করি এটি পয়েন্টটি ব্যাখ্যা করার জন্য খুব ভাল সংযোজন। এটি এই পয়েন্টটি হাইলাইট করে যে স্ট্যাটিক পদ্ধতিটি শ্রেণীর কোনও উদাহরণের প্রয়োজন আগে এটি অ-স্থিতিশীল ডেটা অ্যাক্সেস করার আগে এটি কেন একটি স্বজ্ঞাত কারণ প্রদান করে।
বেন হকিং

@ সাবসন আপনার কোডটি এবং মন্তব্যগুলিও পড়তে হবে।
m3th0dman

@ বেনহকিং "হ্যাঁ" এমনকি আমি মনে করি এটি ভাল পয়েন্ট বলে মনে করে যে "দৃষ্টান্তের পরিবর্তনশীল সর্বদা অবজেক্টের সাথে যুক্ত থাকে"
জাভা

2

আমি মনে করি যে বিষয়টি এখানে বোঝার একটি।

প্রযুক্তিগত দৃষ্টিকোণ থেকে একটি স্ট্যাটিক পদ্ধতি কোনও অবজেক্টের মধ্যে থেকে ডাকা হয় উদাহরণ ক্ষেত্রগুলি দেখার পক্ষে যথেষ্ট সক্ষম। আমি দৃ strongly়ভাবে সন্দেহ করি যে এটিই প্রথম স্থানে প্রশ্নটি সৃষ্টি করেছিল।

বিষয়টি হ'ল উপায়গুলি বস্তুর বাইরে থেকে কল করা যেতে পারে। এই মুহুর্তে তাদের সরবরাহের জন্য কোনও উদাহরণের ডেটা নেই - এবং এইভাবে সংকলকটির কোড সমাধানের কোনও উপায় নেই। যেহেতু উদাহরণস্বরূপ ডেটাগুলি দ্বন্দ্বের কারণ হয়ে উঠেছে সেহেতু আমাদের অবশ্যই উদাহরণস্বরূপ ডেটা অনুমতি দেবে না।


আমি একমত নই একটি স্থিতিশীল পদ্ধতি উদাহরণের ডেটা অ্যাক্সেস করতে পারে না কারণ বস্তুটির উদাহরণের মাধ্যমে উদাহরণ ডেটা অ্যাক্সেস করতে হবে এবং স্থির পদ্ধতিটি কোনও প্রদত্ত উদাহরণের সাথে সম্পর্কিত নয় (তবে শ্রেণির সংজ্ঞা সহ)।
ফিলি ডাব্লু।

আপনি আমার বক্তব্য মিস। ক্লাসের মধ্যে থেকে যদি এটি ডাকা হয় তবে সংকলক এটি কোনও স্ট্যাটিক ক্লাস না হওয়ার সাথে একটি উদাহরণ পয়েন্টারটি পাস করতে পারে। সমস্যাটি যদি অন্য কোথাও থেকে ডেকে আনা হয় - যার অর্থ বেসরকারী স্ট্যাটিক পদ্ধতিগুলি উদাহরণের ডেটা অ্যাক্সেস করতে পারে (তবে অভ্যন্তরীণভাবে স্থিতিশীলতাকে উপেক্ষা করেই এটি করা উচিত)
লরেন পেচটেল

হ্যাঁ, সংকলক / পারে / তবে এটি কেন করা উচিত? এই জাতীয় পয়েন্টারটি পাস করার ফলে এটি একটি ইনস্ট্যান্স পদ্ধতিতে মূলত হ্রাস পায়। আপনার স্টিপুলেশন যে এটি কেবল ব্যক্তিগত পদ্ধতি যা এটি করতে পারে তা হ'ল - প্রতিবিম্ব প্রযুক্তিগুলি / সমস্ত / পদ্ধতিগুলিকে অ্যাক্সেসযোগ্য - ব্যক্তিগত বা না - এটিকে আরও ঝুঁকিপূর্ণ প্রস্তাব করে তোলে। রেডমন্ডে আমাদের বন্ধুরা অন্য দিকে চলে গেছে; যদি আপনি কোনও বস্তুর উদাহরণের বিরুদ্ধে স্থিতিশীল পদ্ধতিতে কল করার চেষ্টা করেন (এবং শ্রেণীটি নিজেই নয়) তবে তাদের ভাষাগুলি একটি সতর্কতা উত্থাপন করে।
ফিল্ড ডাব্লু।

1

একে অ-অবজেক্ট-ভিত্তিক মাত্রায় বসবাস করা স্থির পদ্ধতি হিসাবে ভাবেন।

"অবজেক্ট অরিয়েন্টেড ডাইমেনশন" এ কোনও শ্রেণি বহুগুণে উদাহরণস্বরূপ (উদাহরণস্বরূপ) স্পোন করতে পারে, প্রতিটি অহমের নিজের রাষ্ট্রের মাধ্যমে নিজের বিবেকের বিবেক থাকে।

ফ্ল্যাটে, অ-ওও-মাত্রাতে কোনও শ্রেণি ওও-মাত্রায় বসবাস করে না os তাদের বিশ্ব সমতল এবং পদ্ধতিগত, প্রায় যেন ওওপি আবিষ্কার হয় নি এবং ক্লাসটি একটি ছোট প্রক্রিয়াজাতীয় প্রোগ্রাম এবং স্থির তথ্য কেবল বৈশ্বিক পরিবর্তনশীল vari


1

আমি মনে করি এটির ব্যাখ্যা করার সবচেয়ে সহজ উপায় হ'ল কিছু কোড তাকান এবং তারপরে বিবেচনা করুন আমরা কোডটি কী ফল লাভ করতে পারব।

// Create three new cars.  Cars have a name attribute.  
Car car1 = new Car("Mazda3");
Car car2 = new Car("FordFocus");
Car car3 = new Car("HondaFit");

// Now we would like to print the names of some cars: 
// First off why don't we try this: 

Car.printCarName();

// Expected behaviour: 
// If we think about what we are trying to do here it doesn't
// really make sense.  What instance of car name should this 
// print?  Should it print Mazda3?  FordFoucs?
// What is the expected behaviour?  If we are going to have a
// static call on car call printCarName it should probably do
// something like print all car names or a random car name or
// throw an error.  


//Now lets try this instead: 

Car.printCarName(car1);

// Expected Behaviour: 
// Luckily the expected behaviour is very clear here.  This
// should print Mazda3.  This works as expected.  


// Finally lets try this: 

car1.printMyName();

// Expected Behaviour:
// Same as previous example, however this is the *right* way
// to do it.  

সম্পূর্ণতার জন্য এখানে গাড়ী বর্গ:

public class Car{

    public String name;

    public Car(String name){
        this.name = name;
    }

    public static printCarName(){
        print "Not sure what to do here...  Don't know which car you are talking about.";
    }

    public static printCarName(Car c){
        print c.name;
    }

    public /*NOT static*/ printMyName(){
        print this.name;
    }

}

এই প্রশ্ন জিজ্ঞাসা উত্তর কিভাবে?
gnat

1
@ স্পষ্ট করতে মন্তব্য সহ আপডেট করা।
ষাট ফুটারসুডে

1

অন্যান্য উত্তরগুলি বেশ কিছু বলে, তবে, এখানে কিছু "বিশদ" রয়েছে যা আমি যুক্ত করতে চাই।

স্থিতিশীল পদ্ধতি (জাভা যারা বলুন) কেবল তাদের সাথে সম্পর্কিত কোনও অন্তর্নিহিত বস্তু নেই ( thisযার মাধ্যমে অ্যাক্সেসযোগ্য ) যার সদস্যরা আপনি সাধারণত নাম দ্বারা সরাসরি অ্যাক্সেস করতে পারেন।

এর অর্থ এই নয় যে তারা অ স্থির ডেটা অ্যাক্সেস করতে পারে না।

class MyClass {
  public static void foo(MyOtherClass object) {
    System.out.println(object.member);
  }
}
class MyOtherClass { public int member = 10; }

আমি জানি এটি কেবল একটি বিশদ, তবে আমি আপনার প্রশ্নটি পড়ার সময় অদ্ভুত পেয়েছি। "শুধুমাত্র স্থিতিশীল ডেটা ব্যবহার করতে পারে" এটি অনেক বেশি সীমাবদ্ধ।

যাইহোক, আমি কোডটি পরীক্ষা করিনি, আমি যা বলছিলাম তার উদাহরণ দেওয়ার জন্য আমি এখানে এটি লিখেছিলাম।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.