Tembel başlatmanın Java'ya yerleştirilememesinin bir nedeni var mı?


10

Kullanıcılar için kesinlikle kalıcı olmayan bir sunucuda çalıştığımdan, Kullanıcı ile ilgili her nesne, her istek üzerine dağıtılır.

Sonuç olarak kendimi sık sık kullanılmayan nesnelerin özelliklerinin tembel başlatılmasında buluyorum.

protected EventDispatcher dispatcher = new EventDispatcher();

Oluyor ...

protected EventDispatcher<EventMessage> dispatcher;

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

Bunun Java içine yerleştirilememesinin bir nedeni var mı?

protected lazy EventDispatcher dispatcher = new EventDispatcher();


Aşağıda yorumlarda belirtildiği gibi, bir dilin teorik olarak istediğiniz her şeyi içerecek şekilde gelişebileceğini fark ediyorum. Pratik bir olasılık ölçümü arıyorum. Bu diğer özelliklerle çakışır mı? Uygulama, mevcut olan JVM ile iyi çalışacak kadar basit mi? Ve hatta, bu iyi bir fikir mi?


2
dunno ama örnek kod iş parçacığı için güvenli değil
Armand

2
@Alison synchronizedanahtar kelimesi yöntemde olduğu gibi çalışır. Daha karmaşık inşaat yöntemlerinin bir konaklama olacağını hayal ediyorum. Benim içinde belirli senkronize kendi dünya olarak her isteği ile sorunun niteliğine, nedeniyle kullanım durumunda, anlamsızdır.
Nicole

C # Lazy bir kütüphanede, ancak dil tarafından desteklenmektedir. sankarsan.wordpress.com/2009/10/04/laziness-in-c-4-0-lazyt Java'nın lambdas ve delegeleri ve kapanışları var mı? Bu arada, SO sormak istiyorum, böylece Jon Skeet & co. bilgeliklerini paylaşabilirler.
İş

3
Hemen hemen her şeyi herhangi bir dile inşa edebilirsiniz. Ancak karmaşıklık bütçesi ve özellik listesi sınırlıdır ve dil tasarımcıları yalnızca en önemli gördüklerini içerebilir (Larry Wall hariç - özellikle Perl 6 aka "Tüm paradigmalarınız bize aittir.").

1
Temel sorun, Java'nın meta-programlama olanağı olmayan tek statik dille ilgili olmasıdır. C dilinde bunu 10 dakika içinde makro olarak yazabilirsiniz. C ++ 'da bunu yaklaşık iki dakika içinde bir şablon olarak yazabilirsiniz. Java'da ... yapıştırabilir ve değiştirebilirsiniz.
kevin cline

Yanıtlar:


14

Sorunuza sekiz sayfalık bir cevap: http://tinlizzie.org/~awarth/papers/fool07.pdf

Eğer tembellik eklemek ile sorunları kaba bir şekilde özetleyebilir ve eğer, köşe durumlarda. Yan etkiler çevresinde çok sayıda uyarı vardır. Örneğinizde, kurucunun küresel bir sayacı çarpmak veya G / Ç yapmak gibi görünür yan etkileri olup olmadığını düşünün ... Bunun ne zaman olacağını anlamak zor. Veya istisnalar hakkında daha çirkin yan etkileri düşünün (tembel nesneye başvurduğunuzda ... atılırlar?)

Yukarıdaki makaledeki 6. bölüme atlamanız yeterlidir. (Ve atladığınız sayfalardaki tüm tip sistem resmi mantığına hayran kalın ...)


Kağıdın bu özelliğe hitap ettiği derinlik nedeniyle bu yanıtı kabul etmek. Teşekkürler!
Nicole

TL; DR programladığınızda yan etkileri önlemek için neler olduğunu bilmelisiniz, tembellik ile bu gerçekten elden gelebilir. Hazırda Bekletme durumunu ve bazı insanların bununla ne kadar sorun yaşadığını biliyorsanız, tüm dil için aynısını hayal edin.
Walfrat

10

Tabii ki mümkün. Aslında, scala zaten tam olarak bu özelliğe sahiptir! (Scala bir JVM dilidir ve bayt koduna kadar derler). İşte bir parça scala kaynağı:

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

Ve derlenen kodun bir ara formu şöyle görünür:

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();
      ()
    }
  }

}


Peki bu PT'nin programcılar.stackexchange.com/a/ 110958/24257'deki cevabı ile nasıl uzlaşır ?
Pacerier

6

Öncelikle getX / setX deyimine güvenmek yerine Java diline gerçek özellikler eklemeniz gerektiğini düşünüyorum. Bu şekilde özelliği tembel olarak işaretleyebilirsiniz (ve senkronize, salt okunur vb ...).

Sıralama Neyin için istenir burada (Objective-C, fakat kavram geçerlidir).


0

Tabii ki bu Java'ya eklenebilir, tembel anahtar kelime sözdizimsel şeker olarak uygulanabilir. Ancak, uygulanıp uygulanmayacağı derleyici üreticilerinin vizyonuna bağlıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.