Java'da null bir ifade ne zaman kullanılır?


10

Bir ders için aradığım bir ders kitabında, bir ifade boş olabilir (null deyimi). Null deyimi yalnızca noktalı virgül olarak tanımlanır.

Yürütme zamanında kesinlikle hiçbir şey yapmaz. Null deyimi nadiren kullanılır.

Orta derecede deneyimli bir programcı olarak, nadiren kullanıldıklarını söyledikleri ilginç buluyorum , bu bir yerde bunun bir kullanımı olduğunu ima ediyor.

Böyle bir ifadenin kullanımı ne olabilir?

Yanıtlar:


7

Çoğunlukla işe yaramaz, ancak gerekli olduğu birkaç yer vardır. Örneğin:

while (DoSomething());

Bu, DoSomething()false değerini döndürene kadar yöntemi yürütür . Açıkçası bu, yöntemin bazı yararlı yan etkiler de gerçekleştirdiğini varsayar. Ancak boş ifade, yani izleyen noktalı virgül gereklidir, aksi halde while döngüsü bunun yerine bir sonraki ifadeyi içerecektir.

(Fakat, diğer cevaplar yalanlamak için for(;;) {}olduğunu değil bir ifadeleri içermiyor maddesi için, sadece (opsiyonel) ifadeleri ayırmak için noktalı virgül kullanır sonra parantez beri, boş tabloların bir örneği. Bkz Java dilbilgisi detaylar için.)


3
+1 - şimdiye kadar gerçekten kullandığını gördüğüm tek zamandır (belirtildiği gibi, bir 'for' ifadesinin boş bölümleri biraz farklıdır). Yapacağım tek değişiklik, null deyiminin sıradan bir deyime benzediği halde while döngüsünden hemen sonra kendi satırında bırakılması durumunda bu tür bir kullanımın okunmasının çok kafa karıştırıcı olduğunu belirtmektir. terminatör ...
Jules

12

Bir deyim sözdizimsel olarak gerekli olduğunda, ancak anlamsal olarak gerekli olmadığında kullanabilirsiniz. En yaygın durum, çoğu insan bu kullanımı tuhaf ve okunması zor bulsa da, bir for döngüsünün parçalarından birini bu örnek gibi atlamaktır. Kitabınızın dediği gibi, nadiren kullanılır.


Yani. Yararsız bir dil özelliğidir. Google'a "yalnızca noktalı virgül java" ndan daha çok çoğaltmayı okumak zorunda kalmayı tercih ederim.
Chris Cirefice

2
@ChrisCirefice Öte yandan "sadece noktalı virgül: dili ılımlı olarak bildiğinizi düşünmesi gereken şey oldukça açıktır. Ayrı bir kural değildir, bu sadece diğer kuralların bir sonucudur. bu yüzden gerçekten bir sorun olmadığını söyleyebilirim
Maurycy

1
Kendinizi böyle döngüler yazarken bulursanız, yanlış bir şey yapıyorsunuz demektir.
Bassinator

Bir cihazın tekrar çevrimiçi duruma geldiğini kontrol etmek için kullandığım bir uyku yoklama yöntemim var. Kod neredeyse şuna benziyor: while ( sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { ; }elbette ayrı satırlarda. Bunu şöyle yazmış olabilirdim while ( true ) { if ( ! sleepPoll(device, 1000, TimeUnit.MILLISECONDS) ) { break; } }, ama bu yanlış olur.
BobDalgleish

'Void' yöntemlerinden çıkmaya zorlamak için kullandığımız boş değer değil mi? void method(){ //code here. If(condition){return ;}}.
Laiv

9

While döngüsü kullanmayı tercih ederim , ancak boş bir ifade bunu yazmanıza izin verir:

for (;;) { thread.run(); }

Ancak, null bir ifade ile şunu yazalım:

while(true);
{
    thread.run();
}

Birincil amacı, peşinizden gelen ve ipliğin neden çalışmadığını merak eden zayıf bakım programcısının zamanını boşa harcamaktır. Bir açıklama bir süre izlemelidir. Tek başına ; bir ifadedir. Yani bu ifade bloğu aslında döngünün bir parçası değil.

Bu, iyi kullanımların olmadığı anlamına gelmez. Sadece nadirdirler. Genellikle şöyle görünürler:

{
    ;
}

Çünkü bu şekilde bunu yapmak istediğiniz gibi görünüyor (bu bile bazen yeterli değil).

Montajda bu null deyime NOP denir . Python'da buna geçiş denir . Java'da (ve c'nin diğer çocukları) söylediğiniz gibi bir noktalı virgüldür, hatta doğru olduğunu iddia eder;

Birkaç kullanım biliyorum:

Anlamsal .

Boş bir boşluk ile cevap olarak sıfırı düşürmek arasında bir fark vardır. Açıkçası diyor ki, hayır buraya bir şey koymayı unutmadım. Bu hiçbir şeyin bir anlamı yoktur. Açık bir şey değil. Bu alan bilerek boş bırakılmıştır. Bu şekilde N / A'nın derlenmesini sağlıyoruz.

Boş desen

Renkli bir ampulü bir konveyör bandından tekrar tekrar alan, bir sokete vidalayan, çalıştıran, çıkaran ve bir sonrakini alan karmaşık ve pahalı bir ışık sinyalleme makinesi hayal edin. Bu şeyin kemere taktığınız ampullerin rengiyle neyi işaret ettiğini kontrol edebilirsiniz. Harika, şimdi nihayet kusursuz çalışıyor, patronunuz bu sinyallerin zamanlamasını kontrol etmenin bir yolunu yaratmanızı istiyor. Mesajlar arasına boşluk eklemek istiyor. Korku ile birçok parçanın bu sinyallerin zamanlamasını ve onları senkronize etmenin ne kadar acı olduğunu önemsediğini hatırlıyorsunuz. Hafta sonu işte kalmadan zamanlamayı nasıl kontrol edeceksin? Yanmış ampullerden oluşan bir kutuya bakıp tam anlamıyla parlak bir fikir edinirsiniz.

Bazen, hiçbir şeyi bozmadan bir şeyi kapatmak için polimorfizm kullanmak istersiniz.

Hata ayıklama

Bir kesme noktası ayarladığınızda kesme noktası için bir yer olması gerekir. Şimdi bazı hata ayıklayıcılar, onu kapanan kıvırcık küme parantezine ayarlamanıza izin verecektir, ancak eğer dil yapmazlarsa, dilin sizi zorlamasına izin vermesi güzelse, bu yer bir şey yapmasa bile bir tane koymak için bir yer olabilir.

Gerçekten bir java değil, aynı zamanda:

İkili kıpır kıpır

Montajlar NOP talimatı derlenmiş ikili yürütülebilir ile uğraşmaya izin verir. Ancak modern java derleyicileri o kadar uzağa optimize ediyor ki noktalı virgülün sadece kabarmayacağından emin değilim. Ancak eski günlerde, zamanlamayı kontrol etmek veya daha sonra bir kancaya düşmemize izin vermek için yürütülebilir dosyadaki bu boş noktaları da kullandık. NOP olmadan orada gerçek talimatlar olurdu, bu yüzden kanca yapmak istiyorsanız, kanca için yer açmak için bu talimatları başka bir yere kopyalamanız gerekir. Bu, Java'nın sözdiziminin çoğunu aldığı c dilinde de işe yarıyor. Ama bu çengelin Java'da çok fazla olduğunu düşünmüyorum. Bunu yapmak için Unsur Odaklı Programlama kullanıyoruz .


2
Bu bilgiçlik gibi görünebilir, ancak örnek fornull ifadeler değildir. Boş deyimler (boş deyimler olarak da bilinir) başka yerde de olabilir (an gibi if), ancak aşağıdaki parantezler fornoktalı virgül arasındaki deyimlere izin vermez, yalnızca isteğe bağlı olan bir başlatıcı ve iki ifade içerir. Yani noktalı virgül, bir deyim sonlandırıcıdan farklı bir kullanımdır. Boş bir açıklamafor(;;);
JacquesB

Haklısın, bu bilgiçlik taslayan: P. Güzel, lütfen düzenlememi not et.
candied_orange

-7

Bunu kullanıyorum çünkü Java insan diliyle uyumlu olmayan bir şekilde tasarlandı. Aynı şey C için de geçerlidir.

Bir ifade statement;.

İf-then-else deyimi if (condition) statement; else statement;

Bileşik bloklarla birlikte if-then-else deyimi if (condition) {statements} else {statements}

Bu açıkça saçmalık.

Buna göre if (condition) {statements} else {statements};mantıklı ve makul olanları yazıyorum .

Java tasarımcıları bunu if-then-else gibi bir null deyimi olarak ele almak istiyorsa, bununla iyiyim. Onları mutlu ederse, onları mutlu etsin.


Öyle if (condition) {statements;} else {statements;}. Ayrıca, Java ;s sonra gerek yok konusunda oldukça tutarlıdır }. İnsan dillerinin, bir soru işaretiyle zaten sona erdirilmiş bir cümlenin sonuna sık sık nasıl bir dönem yapıştırmadıkları gibi. (Tabii, orada !?ya ?!sonlar, ancak bu sadece yaklaşık değerlerdir , interrobang karakteri .)
8bittree

1
Tatlı tanrı !! o_O
Áxel Costas Pena
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.