Java'da iki argümanı kontrol edin (ikisi de boş değil veya her ikisi de zarif olarak boş)


161

E-posta göndermek için kullanılan bir kabuk projesi geliştirmek için bahar önyükleme kullandım, örn.

sendmail -from foo@bar.com -password  foobar -subject "hello world"  -to aaa@bbb.com

Eğer fromve passwordargümanlar eksik, bir varsayılan gönderen ve şifre, örneğin kullanın noreply@bar.comve 123456.

Dolayısıyla, kullanıcı fromargümanı geçerse, argümanı da geçmelidir passwordve tersi de geçerlidir. Yani her ikisi de boş değil ya da her ikisi de boş.

Bunu zarif bir şekilde nasıl kontrol edebilirim?

Şimdi benim yolum

if ((from != null && password == null) || (from == null && password != null)) {
    throw new RuntimeException("from and password either both exist or both not exist");
}

14
Bir kenara, boşlukların dikkatlice kullanılmasının kodu okumayı çok daha kolay hale getirdiğine dikkat edin - sadece mevcut kodunuzdaki operatörler arasında boşluk eklemek okunabilirlik IMO'suna önemli ölçüde katkıda bulunacaktır.
Jon Skeet

8
Lütfen "şıklığı" tanımlayın.
Renaud

SMTP kimlik doğrulama bilgileri ve zarf gönderen e-posta adresi için ayrı bir bağımsız değişken grubuna ihtiyacınız vardır. FromE-posta adresi her zaman SMTP kimlik adı değil.
Kaz

3
Gerçekten çok daha optimize edilemez, okunabilir bir kod satırıdır ve aşırı optimizasyon ile hiçbir şey elde edilemez.
diynevala

3
Yan not: bu bir kabuk komut dosyasıysa, şifreler kabuk geçmişine kaydedilmez mi?
vücuduma dokunma

Yanıtlar:


331

^( XOR ) operatörünü kullanmanın bir yolu vardır :

if (from == null ^ password == null) {
    // Use RuntimeException if you need to
    throw new IllegalArgumentException("message");
}

ifSadece bir değişken null ise koşul doğru olacaktır.

Ancak genellikle iffarklı istisna mesajlarıyla iki koşul kullanmak daha iyidir . Neyin yanlış gittiğini tek bir koşul kullanarak tanımlayamazsınız.

if ((from == null) && (password != null)) {
    throw new IllegalArgumentException("If from is null, password must be null");
}
if ((from != null) && (password == null)) {
    throw new IllegalArgumentException("If from is not null, password must not be null");
}

Daha okunabilir ve anlaşılması çok daha kolaydır ve sadece biraz fazladan yazma gerektirir.


152
İki boole xor'un iki boole tercih edilmesinin bir nedeni var !=mı?
Eric Lippert

1
Vay be, ben Boole XOR aynı olduğunu fark etmedi !=. Zihin karmaşası. Ve bu yorumda çok fazla sayıda oy var. Ve, bu yoruma kalite eklemek için, evet, aynı zamanda farklı hata durumu için farklı hata mesajı vermenin daha iyi olduğunu düşünüyorum, çünkü kullanıcı hatayı nasıl düzelteceğini daha iyi bilecektir.
justhalf

1
2 element için iyidir. Bunu> 2 elementle nasıl yapabilirim?
Anushree Acharjee

Öğelerden herhangi biri> 0 ise bir hata mesajı göstermek istiyorum. Varsayılan olarak tümü 0 olarak ayarlanmıştır. Tümü> 0 ise geçerli bir senaryodur. Bu nasıl yapılır?
Anushree Acharjee

Bu şık bir röportaj sorusu yaratacaktır. Acaba programcıların% 'si bunu biliyor. Ama yeterince net olmadığına ve 2 ifmaddeye bölündüğünü kabul etmiyorum - istisnadaki mesaj güzelce belgeliyor (soruyu düzenledim, ancak kabul edilene kadar görünmeyecek)
Adam

286

Eh, ikisinin "sıfırlık" durumunun aynı olup olmadığını kontrol etmeye çalışıyorsunuz. Kullanabilirsin:

if ((from == null) != (password == null))
{
    ...
}

Veya yardımcı değişkenlerle daha açık hale getirin:

boolean gotFrom = from != null;
boolean gotPassword = password != null;
if (gotFrom != gotPassword)
{
    ...
}

18
Sen benim SO heros'um @Kaz'dan birisin, ama hiçbir şey 'ya şu ya da bu, ama ikisi de aynı değil' demez ^. :-)
David Bullock

6
@DavidBullock: Booleans söz konusu olduğunda, hiçbir şey "ya şu ya da bu ama her ikisi de aynı değil" gibi ... "her ikisi de aynı değil"; XOR , Booleans üzerindeki "eşit değildir" işlevi için başka bir addır.
Kaz

5
@Kaz Sadece ^"Hey, benim işlenenlerim boolean " diyor !=. (Bu etki maalesef "benim işlenenlerim sayısal olabilir ve bu noktada ilişkisel bir operatör olmayabilirim" diyerek ihtiyacım olan bir dezavantajdır). Benimle aynı fikirde olmamasına rağmen, kahraman durumun azaldı :-)
David Bullock

3
Sorunun gereksinimlerini, ardından çözümünüzü okuduktan sonra, kod mantıklı ve okunabilir. Ancak 4 yıllık bir geliştirici olarak (hala okulda), bu kodu okumak ve sonra "iş gereksiniminin" ne olduğunu anlamaya çalışmak baş ağrısı olacaktır. Bu koddan, hemen anlamıyorum " fromve passwordher ikisi de null veya her ikisi de null olmamalıdır". Belki de bu sadece ben ve deneyimim değil, ama 3 st kod daha pahalı olsa bile @ stig-hemmer'ın cevabında olduğu gibi daha okunabilir çözümü tercih ediyorum. Sanırım hemen alamadım bool != bool - sezgisel değil.
Chris Cirefice

2
@DavidBullock ^Operatör bitsel bir operatördür; aslında işlenenlerinin boole olduğu anlamına gelmez. Boolean xor operatörü xor.
Brilliand

222

Şahsen, okunabilir ve zarif olmayı tercih ederim.

if (from != null && password == null) {
    throw new RuntimeException("-from given without -password");
}
if (from == null && password != null) {
    throw new RuntimeException("-password given without -from");
}

52
Daha iyi mesajlar için +1. Bu ise , kimse handwaving seviyor önemli "bir şeyler ters gitti" kimse bu yüzden, -hata mesajlar neden böyle mesajlar. Bununla birlikte, uygulamada, kişi daha spesifik bir istisnayı tercih etmelidir (özellikle IllegalArgumentExceptionçıplak yerine RuntimeException)
Marco13

6
@matt, eleştirinizin kodla değil, istisnaların metniyle olduğu anlaşılıyor. Ancak bu cevabın değeri, hata mesajlarının içeriğinde değil, if ifadelerinin yapısında yatıyor. Bu en iyi yanıttır çünkü işlevselliği geliştirir; OP, istisna metinler için istedikleri dizeleri kolayca değiştirebilir.
Dan Henderson

4
@matt Avantajı, iki geçersiz durumdan hangisinin meydana geldiğini ayırt etmenin ve hata mesajını özelleştirmenin mümkün olmasıdır. Yani "bu iki şeyden birini yanlış yaptınız" demek yerine "bunu yaptınız" ya da "bunu yaptınız" diyebilirsiniz (ve istenirse çözüm adımlarını sunmaya devam edin). Karar her iki durumda da aynı olabilir, ancak "bunlardan birini yanlış yaptınız" demek asla iyi bir fikir değildir. Kaynak: Bu işlevi sağlayamadığım bir ortamda, hata metnimdeki ilk koşulu yerine getiren kullanıcılardan birçok soru yönettim.
Dan Henderson

4
@DanHenderson> "bunlardan birini yanlış yaptın" demek asla iyi bir fikir değildir. Katılmıyorum. Şifre / Kullanıcı adı, sadece kullanıcı adı ve şifrenin eşleşmediğini söylemek daha güvenlidir.
matt

2
@DanHenderson Güvenlik açısından , kullanıcı adının dizinde olduğu durum arasında ayrım yapmamak daha iyi olabilir , aksi halde bir saldırgan geçerli kullanıcı adlarını bulabilir. Bununla birlikte null / null değerinin karıştırılması (bu durumda) her zaman bir kullanım hatasıdır ve daha ayrıntılı bir hata mesajı gösterilmesi, ilk etapta sağlanan kullanıcıdan daha fazla bilgi sızdırmaz.
siegi

16

Bu işlevselliği imzalı 2 bağımsız değişken yöntemine yerleştirin:

void assertBothNullOrBothNotNull(Object a, Object b) throws RuntimeException

Bu, ilgilendiğiniz gerçek yöntemde yer tasarrufu sağlar ve daha okunabilir hale getirir. Biraz ayrıntılı yöntem adlarında yanlış bir şey yoktur ve çok kısa yöntemlerde yanlış bir şey yoktur.


14
Yer ve vs yer tasarrufu ((from == null) != (password == null))da anlamak çok basit. Yararlı olmayan yöntemlerle ilgili bir sorun var.
edc65

3
İf ifadesi için bir satır, throw ifadesi için ikinci satır ve kapanış ayracı için üçüncü satır vardır: Hepsi bir satırla değiştirilir. Eğer kapanış parantez yeni bir çizgi verirseniz bir satır daha kaydedildi!
Traubenfuchs

10
Kodu okurken, koşul hokkabazlığına karşı anlamanız gereken bir yöntem adınız vardır.
Traubenfuchs

1
kesinlikle +1, her zaman aşağı ve kirli uygulama ayrıntılarını ve operatörleri, INTENTION'ı netleştiren açıklayıcı yöntemler ve değişken adlarıyla soyutlamayı tercih edin. mantık hata içeriyor. yorumlar daha da kötüdür. yöntem adı niyeti gösterir ve mantığı yalıtır, böylece hataları bulup düzeltmek daha kolaydır. bu çözüm, okuyucunun herhangi bir sözdizimi veya mantık hakkında bilgi sahibi olmasını veya düşünmesini gerektirmez, bunun yerine İŞ GEREKSİNİMLERİNE odaklanmamızı sağlar (gerçekten önemli olan şey)
sara

1
Burada açıklayıcı bir istisna mesajı almak isterseniz gereksiz bir sorunla karşılaşırsınız.
Honza Brabec

11

Bir Java 8 çözümü Objects.isNull(Object), statik bir içe aktarma varsayarak kullanmak olacaktır :

if (isNull(from) != isNull(password)) {
    throw ...;
}

Java <8 için (veya kullanmayı sevmiyorsanız Objects.isNull()) kendi isNull()yönteminizi kolayca yazabilirsiniz .


6
Sevmiyorum. from == null != password == nullhepsini yığının aynı karesinde tutar, ancak Objects.isNull(Object)gereksiz yere kullanarak iki kareyi iter ve çıkarır. Objects.isNull (Object) var çünkü 'Bu yöntem Predicate olarak kullanılıyor' (akarsularda).
David Bullock

5
Bunun gibi basit bir yöntem normalde JIT tarafından hızlı bir şekilde satır içine alınır, böylece performans etkisi büyük olasılıkla önemsizdir. Gerçekten kullanımını tartışabiliriz Objects.isNull()- isterseniz kendi yazınızı yazabilirsiniz - ancak okunabilirlik söz konusu olduğunda isNull(), kullanımın daha iyi olduğunu düşünüyorum . Üstelik sen yapmak için ek parantez gerek basit ifade derleme: from == null != (password == null).
Didier L

2
Ben JIT'ing (ve operasyonların sırası ... tembel oldu) hakkında katılıyorum. Yine de, (val == null)böyledir sağlanan tesis çok null karşılaştırılması amacıyla, ben metot içinde lineable oldukça işlevsel olsa bile, yüzüme bakıyordu atlatmak iki büyük şişman yöntemi invocations zor buluyorum, ve kendini iyi adlandırılmış. Gerçi sadece ben. Son zamanlarda hafif tuhaf olduğuma karar verdim.
David Bullock

4
dürüst olmak gerekirse, kim tek bir yığın çerçeve umurunda? yığın, yalnızca (muhtemelen sonsuz) özyineleme ile uğraşıyorsanız veya sahara çölünün büyüklüğünde bir nesne grafiği içeren 1000 katmanlı bir uygulamanız varsa her zaman bir sorundur.
sara

9

İşte herhangi bir sayıda boş kontrol için genel bir çözüm

public static int nulls(Object... objs)
{
    int n = 0;
    for(Object obj : objs) if(obj == null) n++;
    return n;
}

public static void main (String[] args) throws java.lang.Exception
{
    String a = null;
    String b = "";
    String c = "Test";

    System.out.println (" "+nulls(a,b,c));
}

Kullanımları

// equivalent to (a==null & !(b==null|c==null) | .. | c==null & !(a==null|b==null))
if (nulls(a,b,c) == 1) { .. }

// equivalent to (a==null | b==null | c==null)
if (nulls(a,b,c) >= 1) { .. }

// equivalent to (a!=null | b!=null | c!=null)
if (nulls(a,b,c) < 3) { .. }

// equivalent to (a==null & b==null & c==null)
if (nulls(a,b,c) == 3) { .. }

// equivalent to (a!=null & b!=null & c!=null)
if (nulls(a,b,c) == 0) { .. }

2
İyi yaklaşım, ancak ilk "eşdeğer" yorumunuz korkunç bir şekilde yanlıştır (tüm yorumlarda bulunan yazım hatasının ötesinde)
Ben Voigt

@BenVoigt Düzeltildiğiniz için teşekkür ederiz, düzeltildi
Khaled.K

9

Hem gönderen hem de şifre olmadığında özel bir şey yapmak istediğinizden (varsayılanları kullanın), önce bunu ele alın.
Bundan sonra, e-posta göndermek için hem gönderen hem de parolanız olmalıdır; her ikisi de eksikse bir istisna atar.

// use defaults if neither is provided
if ((from == null) && (password == null)) {
    from = DEFAULT_SENDER;
    password = DEFAULT_PASSWORD;
}

// we should have a sender and a password now
if (from == null) {
    throw new MissingSenderException();
}
if (password == null) {
    throw new MissingPasswordException();
}

Ek bir avantaj, varsayılan değerlerinizden herhangi birinin boş olması durumunda, bunun da algılanmasıdır.


Bunu söyledikten sonra , genel olarak ihtiyacınız olan operatör bu olduğunda XOR kullanımına izin verilmesi gerektiğini düşünüyorum. Bu , dilin bir parçası, sadece bir sır derleyici hatası nedeniyle çalışan bir numara değil.
Bir keresinde üçlü operatörü kullanmak için kafa karıştırıcı bulan bir inek orkum vardı ...


1
Yanıtlarınızdan birini örneklemek için rastgele bir seçim yaptığım ve vaat edilen xkcd linkini yükleyemediğim için indirildi! Yazıklar olsun sana!
dhein

@Zaibis Savunmamda, tam zamanlı bir iş değil, sadece bir hobi. Ama bir tane bulabilir miyim
bakalım

8

Aslında nasıl bu kod parçası yazmak istiyorsunuz başka bir alternatif önermek istiyorum:

if( from != null )
{
    if( password == null )
        error( "password required for " + from );
}
else
{
    if( password != null )
        warn( "the given password will not be used" );
}

Bana göre bu, bu durumu ifade etmenin en doğal yolu gibi görünüyor, bu da gelecekte okuması gerekebilecek biri için anlaşılmasını kolaylaştırıyor. Ayrıca daha yararlı tanılama mesajları vermenize ve gereksiz parolayı daha az ciddi olarak ele almanıza olanak tanır ve bu tür bir durum için oldukça olası olan değiştirmeyi kolaylaştırır. Yani bir komut satırı argümanı olarak bir parola vermenin en iyi fikir olmadığını ve argüman eksikse isteğe bağlı olarak parolanın standart girdiden okunmasına izin vermek isteyebilirsiniz. Veya gereksiz parola bağımsız değişkenini sessizce yok saymak isteyebilirsiniz. Bu gibi değişiklikler, her şeyi yeniden yazmanızı gerektirmez.

Bunun yanı sıra, sadece asgari sayıda karşılaştırma yapar, bu yüzden daha "zarif" alternatiflerden daha pahalı değildir . Her ne kadar performans burada pek olası bir sorun olmasa da, yeni bir işlem başlatmak zaten boş bir kontrolden çok daha pahalı.


Ben biraz konuşma yoluyla yorum, bu yüzden başka bir "// biz bir sıfır var" ile takip edebilir. Örneğin kısalığı bunu gerçekten önemsiz kılar. Mantığın netliğini ve bunun sunduğu testlerin azaltılmasını seviyorum.
Nate

Bu mükemmel çalışıyor, ancak ifadeler bana daha az net ve dağınık görünüyorsa iç içe geçiyor. Bu sadece kişisel bir fikir, bu yüzden bu cevabın başka bir seçenek olarak
Kevin Wells

Zarafet söz konusu olduğunda, bu muhtemelen bunu yapmanın en az zarif yollarından biridir.
16'da dramatik

7

Bunu ele almanın doğru bir yolunun üç durumu göz önünde bulundurmak olduğunu düşünüyorum: 'hem' hem de 'şifre' sağlandı, ikisi de sağlanmadı, ikisinin bir karışımı sağlandı.

if(from != null && password != null){
    //use the provided values
} else if(from == null && password == null){
    //both values are null use the default values
} else{
   //throw an exception because the input is not correct.
}

Orijinal soru yanlış giriş ise akışı kırmak istiyor gibi görünüyor, ancak daha sonra mantığın bir kısmını tekrarlamak zorunda kalacaklar. Belki de iyi bir atış ifadesi şunlar olabilir:

throw new IllegalArgumentException("form of " + form + 
    " cannot be used with a "
    + (password==null?"null":"not null") +  
    " password. Either provide a value for both, or no value for both"
);

2
Bu kod, çalışmadığı için değil, anlaşılması çok zor olduğu için yanlıştır. Başka biri tarafından yazılan bu tür kodların hatalarını ayıklamak sadece bir kabustur.
NO_NAME

2
@NO_NAME Neden anlamanın zor olduğunu anlamıyorum. OP üç durum sağlamıştır: Hem form hem de parola sağlandığında, her ikisi de sağlanmadığında ve istisna oluşturan karışık durum. İkisinin de boş olup olmadığını kontrol etmek için orta koşuldan mı bahsediyorsunuz?
matt

2
@NO_NAME ile hemfikirim, ortadaki davaya bakmak çok fazla ayrıştırma gerektiriyor. Üst çizgiyi ayrıştırmazsanız, null'un orta ile ilgisi yoktur. Bu durumda şifrenin ve şifrenin eşitliği gerçekten sadece boş olmamanın bir yan etkisidir.
jimm101

1
@ jimm101 Evet, bunun bir sorun olduğunu görebiliyordum. Performans avantajı, daha ayrıntılı bir çözüm için minimum / tespit edilemez olacaktır. Sorunun bu olup olmadığını bilmiyorum. Güncelleyeceğim.
matt

2
@matt Bir performans avantajı olmayabilir - derleyicinin ne yapacağının ve bu durumda çipin bellekten ne alacağı açık değildir. Gerçekten hiçbir şey vermeyen optimizasyonlarda birçok programcı döngüsü yakılabilir.
jimm101

6

İşte herhangi bir Xor og uzun ifs içermeyen nispeten basit bir yol. Bununla birlikte, biraz daha ayrıntılı olmanızı gerektirir, ancak tersine, daha anlamlı bir hata mesajı almak için önerdiğim özel İstisnaları kullanabilirsiniz.

private void validatePasswordExists(Parameters params) {
   if (!params.hasKey("password")){
      throw new PasswordMissingException("Password missing");
   }
}

private void validateFromExists(Parameters params) {
   if (!params.hasKey("from")){
      throw new FromEmailMissingException("From-email missing");
   }
}

private void validateParams(Parameters params) {

  if (params.hasKey("from") || params.hasKey("password")){
     validateFromExists(params);
     validatePasswordExists(params);
  }
}

1
bir kontrol akışı ifadesi yerine istisnalar kullanmamalısınız. Bir performans hitinin yanı sıra, daha da önemlisi, zihinsel akışı bozduğu için kodunuzun okunabilirliğini azaltır.
bir phu

1
@anphu Hayır. Sadece hayır. İstisnalar kullanmak, if-else cümlelerinden kurtulduğundan ve kod akışını daha net hale getirdiğinden kod okunabilirliğini artırır. docs.oracle.com/javase/tutorial/essential/exceptions/…
Arnab Datta

1
Bence rutin olarak gerçekleşen ve normal yürütmenin bir parçası olarak kabul edilebilecek bir şey karşısında gerçekten istisnai olan bir şeyi karıştırıyorsunuz. Java dokümanı, bir dosyayı okurken olağandışı yani bellek dışı örnekler kullanır; Geçersiz parametrelerle karşılaşmak istisna değildir. "Normal kontrol akışı için istisnalar kullanmayın." - blogs.msdn.com/b/kcwalina/archive/2005/03/16/396787.aspx
bir phu

İlk olarak: eksik / uygun argümanlar istisnai değilse, neden IllegalArgumentException var? İkincisi: Geçersiz argümanların gerçekten olağanüstü olmadığına inanıyorsanız, o zaman da doğrulanmamalıdır. Başka bir deyişle, sadece eylemi yapmaya çalışın ve bir şeyler ters gittiğinde bir istisna atın. Bu yaklaşım gayet iyi, ancak bahsettiğiniz performans cezası burada önerildiğim yaklaşımda değil. Java istisnaları atıldığında yavaş değildir; iyileşmesi zaman alan yığın izidir.
Arnab Datta

Bağlam anahtardır. OP bağlamında (sendmail uygulaması), kullanıcı adını ve şifreyi unutmak yaygın ve beklenen bir durumdur. Bir füze rehberliği algounda, bir boş koordinat parametresi bir istisna atmalıdır. Paramları doğrulama demedim. OP bağlamında, uygulama mantığını çalıştırmak için istisna kullanma dedim. Yığın izini açmak, bahsettiğim mükemmel vuruş. Yaklaşımınızı kullanarak, sonunda ya PasswordMissingException / FromEmailMissingException'ı yakalayın ya da gevşeyin ya da daha da kötüsü, işlenmeden bırakın. .
bir phu

6

Hiç kimse üçlü operatörden bahsetmemiş gibi görünüyor :

if (a==null? b!=null:b==null)

Bu özel durumu kontrol etmek için iyi çalışır, ancak iki değişkeni genelleştirmez.


1
Güzel görünüyor, ama anlamak daha zor ^, !=iki if
bools

@coolguy Tahminime göre üçlü operatör XOR operatöründen çok daha yaygın (XOR'u bit işlemleri yapmayan kodlarda her gördüğünüzde 'zihinsel sürprizden bahsetmiyorum) ve bu formülasyon kesilmekten kaçınma eğilimindedir ve eğer çifte saldıran hataları yapıştırın.
gbronner

Tavsiye edilmez. Bu, (a! = Null && b == null) ile (a == null && b! = Null) arasında farklılık göstermez. Üçlü operatörü kullanacaksanız:a == null ? (b == null? "both null" : "a null while b is not") : (b ==null? "b null while a is not")
Arnab Datta

5

Niyetlerinizi gördüğüm gibi, her zaman iki özel null'ı da kontrol etmenize gerek yoktur, ancak passwordnull olup olmadığını ve yalnızca null değilse kontrol edin from. Verilen passwordbağımsız değişkeni yok sayabilir ve fromnull ise kendi varsayılanınızı kullanabilirsiniz .

Sözde yazılmış böyle olmalı:

if (from == null) { // form is null, ignore given password here
    // use your own defaults
} else if (password == null) { // form is given but password is not
    // throw exception
} else { // both arguments are given
    // use given arguments
}

4
Bununla ilgili tek sorun, kullanıcı tedarik passwordetmeden tedarik ettiğinde from, şifreyi geçersiz kılmayı amaçlamış olabilir, ancak varsayılan hesabı korur. Kullanıcı bunu yaparsa, bu geçersiz bir talimattır ve söylenmesi gerekir. Program gerektiğini değil giriş geçerli sanki geçin ve devam edin ve kullanıcı belirtmedi şifre ile varsayılan hesabı kullanmayı deneyin. Bunun gibi programlara yemin ederim.
David Bullock

4

Kimsenin bir sınıfın basit bir çözümünü fromve passwordalanlarını ve bu sınıfın bir örneğine referans vermesini söylemediğine şaşırdım :

class Account {
    final String name, password;
    Account(String name, String password) {
        this.name = Objects.requireNonNull(name, "name");
        this.password = Objects.requireNonNull(password, "password");
    }
}

// the code that requires an account
Account from;
// do stuff

Burada fromnull veya null olmayabilir ve null değilse, her iki alanında da null olmayan değerler bulunur.

Bu yaklaşımın bir avantajı, hesabı kullanan kod çalıştığında değil, hesabın başlangıçta alındığı yerde bir alanı yapma, diğer alanı null yapma hatasının tetiklenmesidir. Hesabı kullanan kod yürütüldüğünde, verilerin geçersiz olması mümkün değildir.

Bu yaklaşımın bir diğer avantajı daha semantik bilgi sağladığı için daha okunabilir. Ayrıca, başka yerlerde ad ve şifreyi birlikte kullanmanız gerekebilir, bu nedenle ek bir sınıf tanımlama maliyeti birden fazla kullanım için amorti olur.


Beklenmedik şekilde çalışmaz, çünkü new Account(null, null)hem boş adı hem de parolası olan Hesap hala geçerli olsa bile bir NPE atacaktır.
1919'da

Fikir, gerçek dünyada, hesabın var olup olmadığını söyleseniz de, ad ve parola null ise null değerini iletmektir.
Monica'yı

OP'den aldığım şey , her ikisinin de null olmadığını veya her ikisinin de null olduğunu söylemek. Az önce hem ad hem de parola ile bir Hesap nesnesi nasıl oluşturabileceğinizi merak ettim.
1919'da

@HieuHT Üzgünüm son yorumum net değildi. Ad ve parola null olursa, nullyerine Account. Geçmek olmaz nulliçin Accountyapıcı.
Monica'yı
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.