Neden özel statik yöntemler var?


68

Sadece bir sorumu açıklığa kavuşturmak istedim. Özel görünürlüğe sahip normal bir yönteme karşı özel bir statik yönteme sahip olmanın amacı nedir?

Statik bir yönteme sahip olmanın bir avantajı, sınıfın bir örneği olmadan çağrılabilir olmasıdır, ancak özel olduğu için statik olduğu bir nokta bile olsa?

Düşünebilmemin tek nedeni, nesneyi değil, sınıf düzeyinde yöntemi kavramsal olarak anlamaya yardımcı olmasıdır.


32
Evet, bir sebebi var. Genel / varsayılan statik yöntemleriniz hala özel istatistiklerinizi arayabilir. Statik yöntemlerin hiç kullanılması gerekip gerekmediği ve herhangi bir özel yöntemi kullanmak uygun olduğunda, bu sorularla karıştırmamaya özen gösterin.

2
Hızlı örnek - bir sınıf tarafından kullanılan fabrika yöntemi, diğer sınıfların kullanılmasını önler (sınıfın bir örneğini almak için fabrika yöntemini kullanmanız gerekir).

2
@MattFenwick: Bunu bir cevap olarak göndermelisin.
Doktor Brown

9
Bir yöntemi statik yaparak, aynı zamanda örnek değişkenlerini okumadığını veya yazmadığını da söylüyorsunuz. Örnek değişkenlerle etkileşime girmeyen bir yöntemin taşınması ve başka yerlere yansıtılması genellikle daha kolaydır.
Mark Rogers

1
Statik bir yöntemin özel, dahili veya genel olmasına bakılmaksızın, belirli bir kod senkronizasyon çabası olmadan iş parçacığı açısından güvenli olmadığını unutmayın.
Craig

Yanıtlar:


70

Statik olma özelliği görünürlükten bağımsızdır.

Statik bir yönteme sahip olmak isteyeceğiniz nedenler (statik olmayan üyelere bağlı olmayan bazı kodlar) yine de faydalı olacaktır. Ama belki kimsenin / başka birisinin kullanmasını istemiyorsun, sadece sınıfını.


3
Bence doğru yoldasın, ama aynı zamanda önemli bir noktayı kaçırdığını düşünüyorum. Çoğu statik yöntem, sıfır yan etkiye sahiptir (etkin bir şekilde işlev görür, yöntem değil) - bu yüzden ilk etapta statik hale gelirler. Onlara karşı özel olma argümanı "Yan etkileri yoksa, neden tekrar kod kullanmalarını teşvik etmiyorlar?" Anahtar nokta budur: Özel yaptığımızda, genellikle sadece bu yöntemi değil, bu özel yöntemi kullanan tüm sınıfı yeniden kullanmanızı istiyoruz .
corsiKa

Bunu yapmadım ya da bu davranışı görmedim demeliyim. Yaptığım birkaç şey, kamu statik sınıflarına yardımcı yöntemlerdi.
Miyamoto Akira,

1
@ corsiKa: Yan etkiler sorun değil. Özel olmayan bir sınıfın statik bir üyesi yapmak, bir sınıfın gelecekteki her sürümünün, aynı şeyi yapan aynı isimdeki aynı yöntemi içereceğini vaat eder. İhtiyaçların değişmesi ve sınıfın gelecekteki bir sürümünün tam olarak mevcut olan gibi çalışan bir yönteme ihtiyacı olmaması durumunda, özel bir yöntem güvenle sınıfın yeni gereksinimlerini daha iyi karşılayan bir yöntemle değiştirilebilir. Basit bir örnek olarak, herhalde bir sınıf bir dize alır ve benzeri değişimini yapar bir yöntem ihtiyacı <için &lt;... o yazıldığında vb
Supercat

1
... değil bilinmektedir geçirilen dizeleri herhangi işaretleri içermesi ve bu nedenle dönüştürmez &için &amp;[I kod yazıyor olsaydı dönüştürmek istiyorum &için &amp;bunun gerekli olabilir, ama herhalde beklemiyorduk bile öyle değil]. Bu daha sonra işaretleri işlemek için gerekli olur, ancak yöntem genişletmek için değişen herkese açıktır &etmek &amp;kendi gerçekleştiren dış kodu kırabilir &-to- &amp;ikame. Bununla birlikte, yöntem özelse, &herhangi bir dış kod için sorunlara neden olmadan ele alınması düzeltilebilir .
supercat

Yani az söylemek ilginç bir problem, ama statik olmaktan yapar nasıl görmüyorum herhangi daha bu konuya anahtarıdır statik olmaktan daha bir sorundan kaynaklanabileceğini. Mantığınızı takip edersek, her yerdeki her şey her şeyi yeniden uygular çünkü "omg, bir gün bir hata veya gereksinimler değişirse ne olur?"
corsiKa

26

(Java'da) oldukça yaygın bir sebep, private staticyapıcı karmaşasını azaltmak için basit bir yöntem kullanarak bir yapıcıdaki değişmez alan değişkenlerini başlatmaktır .

  • Bu private: dış sınıflar görmemelidir.
  • Öyle static: bazı işlem, bağımsız gerçekleştirebilirsiniz 1 ev sahibi sınıfın durumunun.

Biraz tartışılmış bir örnek takip ediyor ...

Örneğin:

public class MyClass{
    private final String concatenated;

    public MyClass(String a, String b){
        concatenated = concat(a,b);
    }

    public String getConcatenated(){
       return concatenated;
    }

    /**
    *  Concatenates two Strings as `s1---s2`
    **/
    private static final String concat(String s1, String s2){
        return String.format("%s---%s", s1, s2);
    }
}

1 Diğer staticdeğişkenlerle etkileşimi olmadığını varsayalım.


15
Türetilmiş (hesaplanmış) argümanları bir üst sınıfın kurucusuna iletmeniz gerektiğinde bu daha da değerlidir. super(...)Aramanın sınıf yapıcısı ilk satırı olmalıdır, bu yüzden süper çağrısına geçirmek için ne işe yardımcı olmak için yerel değişkenleri bildirmek olamaz. Ancak, olabilir süper kurucusuna geçmesine değeri çalışmak gerekir kadar satırı kullanmak (özel) statik yöntemler, diyoruz.
Andrzej Doyle

Statik bir başlatıcı blok olasılığı olduğunu unutmayın
Franz Ebner

13

Bir private staticyöntem için yaygın bir kullanım durumu ;

  1. sadece o sınıf tarafından kullanılır
  2. o sınıfın iç durumundan bağımsızdır

12

Birçok yönteminizde tekrarlanan birkaç kod satırınız olduğunu görüyorsunuz, bu nedenle kopyalanan kodlar iyi olmadığından, bunları tek bir yönteme çıkarmaya karar veriyorsunuz.

Yöntemi, yaygın kullanım için tasarlanmadığından ve ilgisiz bir kodun çağrılmasını istemediğiniz için özel yaparsınız. (Yorumlarda bu noktayı tartışın….)

Yöntem hiçbir örnek alana erişmediğinden, statik hale getirebilir, statik hale getirerek anlamanızı kolaylaştırır ve hatta belki biraz daha hızlı hale getirebilirsiniz.

Sonra .... (Belki şimdi, belki sonra, belki asla)

Metot statik hale getirildiğinde, bir birlik sınıfına, yani sınıftan çıkarılabileceği açıktır .

Ayrıca, parametrelerinden birinin bir örnek yöntemine dönüştürülmesi kolaydır, çoğu zaman kodun olması gerektiği yerdir.


Bu cevabı beğendim ama bunun için güncel referansınız var mı? "ve belki biraz daha hızlı"
Magnilex

@ Manyetik, "this" işaretçisi statik sınıf yöntemlerine geçilmez, bu nedenle derleyici "bu" un örnek yönteminde kullanılmadığını tespit etmedikçe, statik örnek yöntemlerinden daha hızlı olma eğilimindedir.
Ian

2

Sınıfta statik bir özel yönteme ihtiyaç duymanız için en az iki neden düşünebiliyorum.

1: Örnekleriniz, doğrudan çağırılmasını istemediğiniz statik bir yöntemi çağırmak için bir nedene sahip olabilir, çünkü belki de sınıfınızın tüm örnekleri arasında veri paylaşır.

2: Genel statik yöntemlerde doğrudan çağrılmasını istemediğiniz alt yordamlar var. Yöntem hala bir örnek olmadan, doğrudan değil denir.

Tabii ki, "sınıfın anlam kazanmasına yardımcı oluyor" tek başına iyi bir sebep.


1

Genel olarak, özel statik yöntemler yazdığımı tespit edersem, ayrı ayrı modellemem gereken bir şey olduğunun göstergesi olarak alırım.

Belirli bir nesne örneğinin durumuna bağlı olmadıklarından, genel ve özel statik yöntemlerden oluşan bir koleksiyon, kendi anlambilimsel ve statik olmayan yöntemlerle tamamen ayrı bir sınıf oluşturabilir.

(Başka bir ipucu, hepsinin bir tür ortak parametreye sahip olduğu çok sayıda statik yönteme (genel ve özel) sahip olduğumda, bu türün üyeleri olarak daha iyi olabilirler.)

Bu nedenle sorunuzu yanıtlamak için, bir sınıf o sınıfın örneğinden bağımsız bir grup ilgili yöntem sağladığında, özel statik yöntemler ortaya çıkar. (... ve bağımsız olduklarından, kendi sınıflarında daha iyi olabilirler.)


-1

Düşünebildiğim çok basit bir örnek, eğer ana fonksiyona geçirilmiş olan giriş argümanları (veya bazı manipülasyonlar) üzerinde bazı işlemler yapmak istiyorsanız. Bu nedenle, eğer işlem büyükse ve aynı işlevsellik başka hiçbir yerde kullanılmayacaksa, başka bir yerde kullanılmayacağına / çağrılmayacağına özel bir işleve sahip olmak mantıklı olacaktı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.