2012-08-10 20 views
20

Kod yazarım arkadaşım static kodlamasını kullanarak nefret ediyor. Yine de Java programım sınıflar arasında bağlantı kurmak için onunla dolu ve bende çok var!Java Static vs Instance

Statik yöntemi kaldırmak için tüm kodu yeniden yazmaya değer mi?

Biri diğerinin üzerinde kullanmanın avantajı var mı?

+2

Durumu korumak için statik değişkenleri kullanmanın programlarınızı gerçekleştirilemez hale getirdiğini buluyorum, temelde genel değişkenleri kullanmak gibi. Bir sınıf içindeki özel statikler, her yerden, yani spagetti kodundan erişen kod olmadığı için aynı soruna sahip değildir. –

cevap

33

1. Örnek değişken her nesne örneği değişkeninin onun kendi kopyası vardır, Nesne başına biridir.

Örn:

public class Test{ 

    int x = 5; 

} 

Test t1 = new Test(); 
Test t2 = new Test(); 

Hem t1 ve t2x kendi kopyasına sahip olacaktır.

2. bir statik değişken Sınıf başına bir, bu sınıf pay aynı Statik değişken her amacıdır.

Örn:

public class Test{ 

    public static int x = 5; 

} 

Test t1 = new Test(); 
Test t2 = new Test(); 

Hem t1 ve t2 aralarında paylaşmak için tam olarak bir x olacaktır. JVM sınıfı yüklendiğinde

3. bir statik değişken başlatılır.

4. bir static methodolamaz erişim Non-static değişken ya da metot. sınıfların bir sürü varken olduğu gibi

5.Static variables can mimik bir Singleton Pattern birlikte Static methods fakat BT, o zaman sınıf yükleme sipariş hakkında emin olamaz, DOĞRU DEĞİL JVM ve bu bir sorun oluşturabilir. statik üyesi daha sonra sınıfın statik yapıcı denir iç ya da sınıfın dışından gelen çağrıldıktan sonra

+4

Sorunun statik değişkenler ve neden kötü olduklarını düşünmüyorum. Kodlayıcı arkadaşının kötü dediği statik değişkenleri ortadan kaldırmaya değip değmeyeceğidir. –

+4

Ne olduklarını ve Sınıf ile nasıl ilişkilendirildiklerini anlattım. Şimdi kodlayıcı arkadaşına, kullanıp kullanmamaya karar vermesi gerekiyor ... 5. noktamda, bazen nasıl kötüleştiğini de belirttim –

7

static Eğer

instance değişkenleri nesnenin her örneği için ayrı bir kopyasını istiyorum durumlar için her biri örneğin kopyasını istemiyorum durumlarda içindir.

Kullanılacak iş durumlarına göre değişebilir.

+0

Sorun, statik alanların genellikle kod kokusunun bir örneğidir. Özellikle belirtilen OP olarak, sınıflar arası iletişim için kullanıldığından, temelde küresel değişkenlerdir. Okunamayan herhangi bir genel statik değişkenten uzak duruyorum. –

+0

@JuanMendes: Yorumunuza katılıyorum. – kosa

+0

Bu, işlevler kadar değişkenler için de kullanıyor mu? – Kezz101

3

Çöp Toplama - statik alanlar örnek alanlardan çok daha uzun süre yaşamaktadır. Mantıksal bakış açısından, statik alanlar ONLy'nin her bir örnekte paylaşılacağını varsayar - eğer gerçekten sizin durumunuzsa, o zaman sorun yoktur.

+1

içeriyor. Bence sizin noktanız, genel statik değişkenlerin kötü olanlar (sabitler hariç) –

+0

@JuanMendes çok doğru! bundan bahsetmeliydim. – Eugene

4

Çok fazla statik işleviniz ve değişkeniniz varsa, gerçek OO yerine daha işlevsel bir yaklaşıma yol açabilir. Ayrıca eğer genel statik değişkeniniz varsa, iyi olmayan global değişkeni çoğaltabilirsiniz. Onları takip etmek bir kabus.

Genellikle Kuralımın eğer yapabilirsen örnek değişkenleri kullanır ve yalnızca gerçekten bir sınıf yerine bir nesnenin üzerine jenerik ise statik değişkenleri ve fonksiyonlara sahip

Bu benzer sorulara oldukça iyi cevaptır etmektir Java: when to use static methods

Sadece yöntemlerle bağlantı kurmak yerine yeni bir işlem oluşturmak için yeni bir işlem kullanmayı düşünün ve bu yönteme statik olmayan bir şekilde erişin.

önce

public void myMethod(){ 
    Time.setTime(Time.getTime() + 20); 
    System.out.println(Time.getTime()); 
} 

public void myMethod(){ 
    Time t = new Time(); 
    t.setTime(t.getTime() + 20); 
    System.out.println(t.getTime()); 
} 

şimdi oluşturduğunuz zaman örneğine olacak bu yöntemlerin tutulur Herhangi devlet

sonra. Gerekirse, t değişkenini diğer yöntemlerle paylaşabilirsiniz.

+0

Teşekkürler Genel statik değişkenler hakkında tam olarak ne kötüdür? – Kezz101

+0

Sorun, küresel değişkenleri taklit etmeleridir. Bunlar, kodun herhangi bir yerinde güncellenebilir ve güncellendikleri yeri ve hangi durumda olduklarını takip etmeyi çok zorlaştırırlar. Bulmak çok zor olan hatalara yol açabilir. Bu bağlantı bunu açıklamakta oldukça iyidir. http://c2.com/cgi/wiki?GlobalVariablesAreBad Daha fazla açıklık istiyorsanız bana bildirin – RNJ

+0

Ah şimdi anlıyorum! Onay için teşekkürler: D – Kezz101

0

Eğer gerçekten küresel değişkenler ile kombine fonksiyonel programlama uygularken (singleton durumunda hariç) statik nesneleri kullanın. Bunu çok yaparsanız - ya tasarımınızı ya da Java'yı tekrar gözden geçirmelisiniz (belki liste, şema vb. Gibi işlevsel bir programlama dili kullanmalısınız).

1

Statik yöntemler veya statik özellikler hakkında mı konuşuyorsunuz?

Bildiğim kadarıyla statik yöntemler bunları kötüye tek bir yolu vardır, endişe ve bir parametre olarak bir nesne örneğini almak yöntemlerini tanımlarken olmasıdır. Bunu asla yapmamalısınız ve benim görüşüme göre kötü kodlama uygulamasıdır. İşte bir örnek:

static int add(ThisClass a, ThisClass b) { 
    return a.value + b.value; 
} 

sınıfta statik değişkenler bahsediyoruz varsa, belli bir sınıfın yalnızca bir örneği olacaksa amaçlanmıştır olan "tekiz" konusunda içine temelde bulunmaktadır. Singletonlar çok fazla suistimale maruz kalır.Birçok sınıf kütüphanesi tarafından kullanılırlar (JDNI ve kayıt sınıflarını düşünürler), ancak bir uygulama bunları kapsamlı bir şekilde kullanırsa, kötü yapılandırılmış bir programın işareti olabilir. Muhtemelen arkadaşının ne hakkında olduğunu biliyordur.

0

Pro Statik

. "Statik nesne" tüm oturum boyunca yaşayacaktır, dolayısıyla performansta kazanacaksınız.

Con Statik

Statik üyeler dolayısıyla onlar sınıfın statik olmayan üyelere söz edilemez, durumlarına sahip olamaz. Biz BigInteger class düşünürsek parçaların bazı statik üyeleri haline yapıldıysa

Örnek

, bu sınıf kazanabilir.

Sınıfın bir örneği (beklendiği gibi) büyük bir tam sayıyı temsil eder.Bununla birlikte, ana yöntemler eklendikçe ve çoğaldıkça, performans açısından kötü olan statik (daha iyi bir dünyada olması gerekir) değildir. Dolayısıyla, uygulamada statik ve statik olmayan karışımlardan korkulmamalıdır.

0

Statik değişkenleri veya yöntemleri kullanmayı sevmiyorum çünkü bunlar gerçek bir mirasa sahip değiller. Bu test için alay etmek daha zor hale getirir. Örnekler kullanarak tam polimorfizmin esnekliğini sağlar. Öte yandan, bazen global bir önbellek gibi statik değişkenler gereklidir. Statik yöntemler, erişemediğiniz ya da uzatamayacağınız sınıflar/nesneler/ilkel maddeler için yardımcı yöntemler sağlarlarsa bir yarar sağlayabilir. Bu yardımcı yöntemler o kadar basit ki mirasa ihtiyaç duymazlar. Örneğin java.util.Arrays sınıfı veya java.util.Collections.

1

Örnek ve Statik değişken: En Soru

Cevap: Ben bellek ayırmayı kaydetmek için statik değişkeni kullanmak değer olduğunu söyleyebilirim.

Bellek ayırma

: statik değişken yalnızca bir bellek yeri için

oluşturulan nesnenin hiçbir etmek ve Örnek değişken her nesne bir hafıza konumu için irespective tahsis edilir

Şimdi bu örneği dikkate tahsis 1M nesnesini Çalışan sınıfında oluşturmanız gereken şirket iç projesi üzerinde çalıştığınızı ve Çalışanlar sınıfının bazı özelliklerinin e olduğunu düşünün. id, ename, ittifak şimdi Önemli olan tüm çalışanlar XYZ şirkette çalışıyoruz yani değer e-posta şirket çalışanı ne olursa olsun "XYZ" olacak.

Şimdi de 1 Milyon Nesne için XYZolacak mülkiyet ecompany durumu, değerini bilmek.

Şimdi çok daha az karşılaştırmak sadece 48 byte olacaktır ecompany tahsis statik sonra asgari bellek olarak beyan ettikleri takdirde Eğer bellek ayırma

dikkate statik veya örneği olarak ecomapny mal beyanında istediğinize karar 1 Milyon örnek değişkenini depolamak için gereken belleğe. 100000 * 48 bayt = 48 Milyon bayt.