অলস সূচনাটি জাভাতে তৈরি করা যায়নি এমন কোনও কারণ আছে কি?


10

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

ফলস্বরূপ আমি প্রায়শই নিজেকে অজানা হতে পারে এমন সামগ্রীর বৈশিষ্ট্যের অলস সূচনা করতে দেখি।

protected EventDispatcher dispatcher = new EventDispatcher();

হয়ে ...

protected EventDispatcher<EventMessage> dispatcher;

public EventDispatcher<EventMessage> getEventDispatcher() {
    if (dispatcher == null) {
        dispatcher = new EventDispatcher<EventMessage>();
    }
    return dispatcher;
}

এটি জাভা মধ্যে নির্মিত যেতে পারে না কোন কারণ আছে?

protected lazy EventDispatcher dispatcher = new EventDispatcher();


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


2
ডান্নো তবে উদাহরণ কোডটি থ্রেড-সেফ নয়
আর্মন্ড

2
@ অ্যালিসন synchronizedকীওয়ার্ডটি একই পদ্ধতিতে কাজ করবে যেমন এটি পদ্ধতিতে ছিল। আমি ভাবছি আরও জটিল নির্মাণ পদ্ধতির কিছু ব্যবস্থা থাকবে। আমার নির্দিষ্ট ব্যবহারের ক্ষেত্রে, সমস্যার প্রকৃতির কারণে, প্রতিটি অনুরোধকে এটি নিজস্ব বিশ্বের হিসাবে, সিঙ্ক্রোনাইজ করা অর্থহীন।
নিকোল

সি # অলস একটি লাইব্রেরিতে রয়েছে তবে এটি ভাষা দ্বারা সমর্থিত। sankarsan.wordpress.com/2009/10/04/laziness-in-c-4-0-lazyt জাভাতে ল্যাম্বডাস এবং ডেলিগেটস এবং ক্লোজার রয়েছে? যাইহোক, আপনি এসও এর কাছে এটি জিজ্ঞাসা করতে চান, যাতে জন স্কিটি & কো। তাদের জ্ঞান ভাগ করে নিতে পারেন।
কাজ

3
আপনি যে কোনও ভাষায় বেশ কিছু তৈরি করতে পারেন। তবে জটিলতার বাজেট এবং বৈশিষ্ট্য তালিকা সীমিত এবং ভাষা ডিজাইনাররা কেবল তাদেরকে সবচেয়ে গুরুত্বপূর্ণ বলে বিবেচনা করতে পারে (ভাল, ল্যারি ওয়াল ব্যতীত - বিশেষত পার্ল 6 ওরফে "আপনার সমস্ত দৃষ্টান্ত আমাদের অন্তর্ভুক্ত।")

1
মূল সমস্যাটি হ'ল জাভা হ'ল একমাত্র স্ট্যাটিকালি টাইপ করা ভাষা যা কোনও মেটা প্রোগ্রামিং সুবিধা নেই। সিতে আপনি এটি দশ মিনিটের মধ্যে ম্যাক্রো হিসাবে লিখতে পারেন। সি ++ এ আপনি প্রায় দুই মিনিটের মধ্যে এটি টেম্পলেট হিসাবে লিখতে পারেন। জাভাতে আপনি ... পেস্ট এবং সংশোধন করতে পারেন।
কেভিন

উত্তর:


14

আপনার প্রশ্নের আট পৃষ্ঠার উত্তর এখানে: http://tinlizzie.org/~awarth/papers/fool07.pdf

যদি আমি অলসতা যুক্ত করার সাথে সমস্যাগুলি সংক্ষিপ্তভাবে সংক্ষিপ্ত করে চেষ্টা করতে পারি তবে এটি কোণার ক্ষেত্রে। পার্শ্ব প্রতিক্রিয়া কাছাকাছি প্রচুর সতর্কতা রয়েছে। আপনার উদাহরণের মধ্যে বিবেচনা করুন, যদি কনস্ট্রাক্টর এর সাথে বিশ্বব্যাপী কাউন্টার বাম্প করা বা আই / ও করার মতো দৃশ্যমান পার্শ্ব-প্রতিক্রিয়া থাকে ... তবে কখন তা ঘটবে তা নিয়ে तर्क করা শক্ত। বা ব্যতিক্রমগুলি সম্পর্কে এমনকি কৃপণতর পার্শ্ব-প্রতিক্রিয়াগুলি বিবেচনা করুন (আপনি যখন অলস বস্তুটি উল্লেখ করেন তখন তারা ফেলে দেওয়া হয়?)

উপরের কাগজে সবেমাত্র বিভাগ 6 এ যান। (এবং আপনি যে পৃষ্ঠাগুলি এড়িয়ে গেছেন তাতে সমস্ত ধরণের সিস্টেমের আনুষ্ঠানিক যুক্তির প্রশংসা করুন ...)


কাগজটি এই বৈশিষ্ট্যটির গভীরতার কারণে এই উত্তরটি স্বীকার করছে। ধন্যবাদ!
নিকোল

টিএল; ডিআর আপনি যখন প্রোগ্রাম করেন তখন আপনাকে আলস্যতার সাথে পার্শ্ব প্রতিক্রিয়া প্রতিরোধে কী ঘটে তা জানতে হবে, এটি সত্যিই হাতছাড়া হয়ে যেতে পারে। আপনি যদি হাইবারনেট জানেন এবং কিছু লোকেরা এর সাথে কতটা সমস্যায় পড়েছে তবে পুরো ভাষার জন্য কেবল একই চিত্রটি তৈরি করুন।
ওয়ালফ্র্যাট

10

অবশ্যই এটি সুস্পষ্টভাবে সম্ভব। আসলে, স্কালার ইতিমধ্যে ঠিক এই বৈশিষ্ট্যটি রয়েছে! (স্কালা একটি জেভিএম ভাষা এবং বাইকোডে সংকলন করে)। এখানে স্কেলার উত্সের একটি অংশ:

class Foo {
  lazy val bar = "Hello World"
}

এবং সংকলিত কোডটির মধ্যবর্তী ফর্মটি এখানে দেখতে কেমন:

scalac -Xprint:icode Foo.scala

[[syntax trees at end of icode]]// Scala source: Foo.scala
package <empty> {
  class Foo extends java.lang.Object with ScalaObject {
    @volatile protected var bitmap$0: Int = 0;
    lazy private[this] var bar: java.lang.String = _;
    <stable> <accessor> lazy def bar(): java.lang.String = {
      if (Foo.this.bitmap$0.&(1).==(0))
        {
          Foo.this.synchronized({
            if (Foo.this.bitmap$0.&(1).==(0))
              {
                Foo.this.bar = "Hello World";
                Foo.this.bitmap$0 = Foo.this.bitmap$0.|(1);
                ()
              };
            scala.runtime.BoxedUnit.UNIT
          });
          ()
        };
      Foo.this.bar
    };
    def this(): Foo = {
      Foo.super.this();
      ()
    }
  }

}


তাহলে কীভাবে এটি প্রোগ্রামারস.স্ট্যাকেক্সেঞ্জঞ্জ . com/a/110958/24257 এ পিটির উত্তরের সাথে মিলন করবে ?
পেসারিয়ার

6

আমি মনে করি আপনার প্রথমে getX / setX আইডিয়মের উপর নির্ভর না করে জাভা ল্যাঙ্গাউজে আসল সম্পত্তি যুক্ত করা দরকার। এইভাবে আপনি সম্পত্তিটি অলস হিসাবে চিহ্নিত করতে পারেন (এবং সিঙ্ক্রোনাইজ করা, কেবলমাত্র পঠনযোগ্য ...)।

এখানে যা চাওয়া হয়েছে তা বাছাই করুন (উদ্দেশ্য-সি, তবে ধারণাটি প্রযোজ্য)।


0

অবশ্যই এটি জাভাতে যুক্ত হতে পারে, অলস কী শব্দটি সিন্ট্যাকটিক চিনি হিসাবে প্রয়োগ করা যেতে পারে। তবে, এটি প্রয়োগ করা হবে সংকলক নির্মাতাদের দৃষ্টিভঙ্গির উপর নির্ভর করে।

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