Arayüz sabitlerinin kullanımı nedir?


123

Java öğreniyorum ve Arayüzün genel statik ve nihai alanlara sahip olabileceğini buldum. Şimdiye kadar bunların hiçbir örneğini görmedim. Bu Arayüz Sabitlerinin kullanım durumlarından bazıları nelerdir ve bazılarını Java Standart Kitaplığı'nda görebilir miyim?

Yanıtlar:


190

Statik üyeleri bir arayüze yerleştirmek (ve bu arayüzü uygulamak) kötü bir uygulamadır ve bunun için bir isim bile vardır, Sabit Arayüz Antipattern , bkz.Etkili Java , Madde 17:

Sabit arayüz modeli, arayüzlerin kötü kullanımıdır . Bir sınıfın bazı sabitleri dahili olarak kullandığı bir uygulama ayrıntısıdır. Sabit bir arabirim uygulamak, bu uygulama ayrıntısının sınıfın dışa aktarılan API'sine sızmasına neden olur. Sınıfın sabit bir arabirim uygulamasının bir sınıfın kullanıcıları için hiçbir önemi yoktur. Hatta kafalarını karıştırabilir. Daha da kötüsü, bir taahhüdü temsil eder: eğer gelecekteki bir sürümde sınıf, artık sabitleri kullanmaya gerek kalmayacak şekilde değiştirilirse, ikili uyumluluğu sağlamak için yine de arabirimi uygulamalıdır. Son olmayan bir sınıf sabit bir arabirim uygularsa, tüm alt sınıflarının ad alanları arabirimdeki sabitler tarafından kirletilir.

Java platform kitaplıklarında aşağıdaki gibi birkaç sabit arabirim vardır: java.io.ObjectStreamConstants . Bu arayüzler anormallik olarak görülmeli ve taklit edilmemelidir.

Sabit arayüzün bazı tuzaklarından kaçınmak için (çünkü insanların onu uygulamasını engelleyemezsiniz), özel kurucuya sahip uygun bir sınıf tercih edilmelidir (örnek Wikipedia'dan ödünç alınmıştır ):

public final class Constants {

    private Constants() {
        // restrict instantiation
    }

    public static final double PI = 3.14159;
    public static final double PLANCK_CONSTANT = 6.62606896e-34;
}

Ve sabitlere tam olarak nitelendirmek zorunda kalmadan erişmek için (yani, sınıf adlarının önüne sınıf adı eklemek zorunda kalmadan), statik bir içe aktarma kullanın (Java 5'ten beri):

import static Constants.PLANCK_CONSTANT;
import static Constants.PI;

public class Calculations {

    public double getReducedPlanckConstant() {
        return PLANCK_CONSTANT / (2 * PI);
    }
}

12
Tamam, ama ya sadece sabit tanımlama için olmayan bir arayüze sahipseniz? Bu yüzden, birçok sınıf tarafından uygulanan ve yöntem bildirimlerini içeren bir arayüzüm var, ancak aynı zamanda örneğin boyut gibi bazı ortak değerler de eklemek istiyorum. Bu durumda gerçekten kötü bir model. Genel olarak, sadece sabitler için arayüz oluşturmanın bir anti-model olduğuna katılıyorum.
Łukasz Rzeszotarski

11
Kötü bir şey değil, çünkü birisi bunu bir kitapta söylüyor. Bu sabitlere erişmek için bu arayüzü uygulamadığınız sürece sorun değil.
ACV

11
Hayır Hayır Hayır. Etkili Java'daki bu alıntı başka bir şey hakkındadır! Yalnızca arayüzler sabitler oluşturmak, bu sabitleri tutan sınıflara daha iyi bir alternatiftir. Etkili java şöyle der: "Bir sınıfın bazı sabitleri dahili olarak kullanması bir uygulama ayrıntısıdır". Ama burada durum böyle değil. 'Global' sabitlerden bahsediyoruz. Ve kim içinde yöntem bildirimleri olmayan bir arabirim uygulamak ister ki?
ACV

6
ACV'ye katılıyorum. Sabit arayüz dışa aktarılan API modülünün bir parçası değilse veya hiçbir yerde uygulanmadığında, sorunu görmüyorum. Const final sınıflarını kullanmak çirkin: hiçbir faydası olmadığı için kodu karıştıran özel bir kurucuya ihtiyacınız var.
Lawrence

2
Bu cevap, "Etkili Java" kitabındaki ana noktayı doğru bir şekilde sunmuyor, çünkü ana noktayı parantez içine koyarak "(ve bu arayüzü uygulayarak)" "düşürüyor". Bunun yerine, arabirimlerdeki sabitlerin noktasını vurgular (böyle bir arabirim uygulamazsanız sorun olmaz). Genel olarak kötü bir cevap değildir, çünkü alıntı yapılan parçayı dikkatlice okursanız, o zaman "Etkili Java" nın yazarının orijinal olarak ne kastettiğini görebilirsiniz. Ama yanıltıcı buluyorum. Kanımca "ve bu arayüzü uygulama" kısmı, onu vurgulamak için kalın yazı tipiyle yazılmalıdır.
krm

17

" Sabit arayüz modeli, arayüzlerin kötü kullanımıdır "

Bu hipotezi kim uydurmuşsa, ne kadar guru olursa olsun, onu kötü alışkanlıkları ve uygulamaları verimli bir şekilde uygulamaya devam etme ihtiyacı temelinde oluşturmuştur. Hipotez, kötü yazılım tasarım alışkanlıklarının geçerliliğinin teşvik edilmesine dayanmaktadır.

Bu hipoteze karşı bir cevap yazdım: Java'da sabitleri uygulamanın en iyi yolu nedir? bu hipotezin temelsizliğini açıklıyor.

Bu hipotezi haksız kılan gerekçelerimi yayınladıktan sonra 2 saat içinde kapanana kadar, bu soru 10 yıl boyunca açık kalmıştı ve bu yanlış yönlendirilmiş hipoteze yürekten bağlı olanların tartışmaya İSTİSMARLIĞINI ifşa ediyordu.

Bunlar hipoteze karşı ifade ettiğim noktalar

  • Bu hipotezi sürdürmenin temeli, kötü yazılım alışkanlıklarının ve metodolojilerinin etkileriyle başa çıkmak için yöntemlere ve KISITLAYICI kurallara ihtiyaç duyulmasıdır.

  • " Sürekli arayüz modeli, arayüzlerin kötü kullanımıdır " düşüncesini savunanlar, bu kötü alışkanlıkların ve uygulamaların etkileriyle başa çıkma ihtiyacının neden olduğu nedenler dışında herhangi bir neden sunamazlar.

  • Temel sorunu çözün.

  • Öyleyse neden kendi rahatınız için Java dil yapısının her dil özelliğini tam olarak kullanıp yararlanmıyorsunuz? Ceket Gerekmez. Neden etkisiz yaşam tarzınızı daha etkili yaşam tarzlarını ayırt etmek ve suçlamak için barikat kurmak için kurallar icat ediyorsunuz?

Temel sorun

bilgi organizasyonudur. Sürece aracılık eden bilgi ve bu bilginin davranışı, mühendislikten veya sürece çözümler eklemeden önce, sözde iş kuralları ile birlikte anlaşılmalıdır. Bu tür bir bilgi organizasyonu yöntemi, birkaç on yıl önce veri normalizasyonu olarak adlandırıldı.

O zaman sadece bir çözümün mühendisliği mümkün olabilir çünkü bir çözümün bileşenlerinin tanecikliği ve modülerliğini, bilgi bileşenlerinin tanecikliği ve modülerliği ile hizalamak optimal stratejidir.

Bilgiyi organize etmenin önünde iki veya üç önemli engel vardır.

  1. Veri modeli "normalleştirme" ihtiyacına yönelik algı eksikliği.

  2. EF Codd'un veri normalleştirme konusundaki ifadeleri hatalı, kusurlu ve belirsizdir.

  3. Çevik mühendislik kılığına giren en son moda, ilerideki modüllerin organizasyonunu planlamamalı ve koşullandırmamalı, çünkü ilerledikçe yeniden düzenleme yapabilirsiniz. Mazeret olarak gelecekteki keşiflerden etkilenmeden yeniden düzenleme ve sürekli değişim kullanılmaktadır. O zaman, kârları ve varlıklandırmayı geciktirmek için muhasebe hilelerinin kullanılmasıyla proses bilgilerinin davranışına ilişkin temel keşifler yapılır, bu nedenle temel bilgi ve bunların tedavisine şu anda ihtiyaç olmadığı kabul edilir.

Arayüz Sabitlerini Kullanmak İyi Bir Uygulamadır.

Sırf geçici vur-kaç programlama alışkanlıklarınızı sevdiğiniz için kurallar koymayın veya ona karşı herhangi bir fetva yayınlamayın.

Silahı nasıl kullanacağını bilmeyen ya da silahı kötüye kullanma eğilimi gösteren insanlar olduğu için silah sahipliğini yasaklamayın.

Oluşturduğunuz kurallar, profesyonel olarak kodlama yapamayan acemileri programlamak için tasarlanmışsa ve kendinizi onların arasında sayıyorsanız, bunu söyleyin - fetvanınızın uygun şekilde normalleştirilmiş veri modelleri için geçerli olduğunu beyan etmeyin.

Aptalca bir akıl yürütme - Arayüzler Java dilinin yalakaları tarafından bu şekilde kullanılmak üzere tasarlanmadı mı?

Kurucu babaların ABD Anayasası için ilk niyetlerinin ne olduğu umurumda değil. Yazılmamış kodlanmamış niyetler umrumda değil. Sadece yazılı Anayasa'da tam anlamıyla neyin kodlandığı ve toplumun etkin işleyişi için bunları nasıl kullanabileceğimle ilgileniyorum.

Yalnızca Java dili / platform özelliklerinin bana neye izin verdiğiyle ilgileniyorum ve yazılım çözümlerimi verimli ve etkili bir şekilde ifade etmem için bir ortam sağlamak için bunları sonuna kadar kullanmak niyetindeyim. Ceket gerekmez.

Enum Sabitlerinin kullanımı aslında Korkunç Bir Uygulamadır.

Parametreyi değere eşlemek için fazladan kod yazmayı gerektirir. Java'nın kurucularının sizin yazınız olmadan parametre-değer eşlemesi sağlamamış olması, eşleme kodunun Enum Sabitlerinin Java dilinin kasıtsız kullanımı olduğunu gösterir.

Özellikle parametrelerinizi normalleştirmeye ve bileşenleştirmeye teşvik edilmediğiniz için, bir Enum torbasına karıştırılan parametrelerin aynı boyuta ait olduğuna dair yanlış bir izlenim olacaktır.

Sabitler API Sözleşmesidir

Bunu unutma. Veri modelinizi tasarlayıp normalleştirdiyseniz ve bunlar sabitler içeriyorsa, bu sabitler sözleşmelerdir. Veri modelinizi normalleştirmediyseniz, bu kötü alışkanlıkla başa çıkmak için kısıtlayıcı kodlamanın nasıl uygulanacağı konusunda verilen fetvalara uymalısınız.

Bu nedenle, Arayüzler, Sabitler sözleşmesini uygulamanın mükemmel bir yoludur.

Garip bir varsayım - Arayüz yanlışlıkla uygulanırsa ne olur?

Evet. Herhangi biri istemeden herhangi bir arayüzü yanlışlıkla uygulayabilir. Bu kadar kasıtsız programcıların önüne hiçbir şey çıkmaz.

Veri modelinizi sızıntıya karşı tasarlayın ve normalleştirin

Anlaşılmamış / başıboş parametrelerin API'ye sızmasına neden olan varsayılan kötü uygulamaları korumak için kısıtlayıcı kararnameler koymayın. Suçu Arayüz Sabitlerine atmak yerine temel sorunu çözün.

IDE kullanmamak kötü bir uygulamadır

Normal işleyen ve ETKİLİ bir programcı, su altında ne kadar kalabileceğini, kavurucu sıcağında veya yağışlı fırtınalarda ne kadar yürüyebileceğini kanıtlamak için orada değildir. Her gün işe 10 mil gitmek için araba, otobüs veya en azından bisiklet gibi verimli bir araç kullanacak.

Sırf IDE'siz programlamaya ezoterik bir çilecilik takıntınız olduğu için diğer programcılara kısıtlama koymayın.

Programcıların kötü alışkanlıkları verimli bir şekilde uygulamaya devam etmelerine yardımcı olmak için birkaç çerçeve tasarlanmıştır.

OSGI böyle bir çerçevedir. Ve Arayüz Sabitleri aleyhindeki kararname de öyle.

Bu nedenle kesin cevap ...

Arayüz sabitleri, bir veri modelinin iyi tasarlanmış ve normalleştirilmiş bileşenlerini Sözleşme'ye yerleştirmenin etkili ve verimli bir yoludur.

Bir sınıf dosyasına yerleştirilmiş uygun şekilde adlandırılmış özel bir arabirimdeki arabirim sabitleri, tüm özel sabitlerinizi dosyanın her yerine dağıtmak yerine gruplamak için de iyi bir uygulamadır.


29
Tüm noktalarınız şaka, alay, duygusallık olmadan yapılabilir. Stackoverflow, bir blog platformu değildir.
tkruse

1
"Kurucu babaların ABD Anayasası için asıl niyetlerinin ne olduğu umrumda değil. Yazılmamış kodlanmamış niyetler umrumda değil. Sadece yazılı Anayasa'da tam anlamıyla kodlanmış olanı ve bunları nasıl istismar edebileceğimi umursuyorum. toplumun etkin işleyişi. " - bu iyi bir alegori değil mi?
Blessed Geek

"Parametreyi değere eşlemek için fazladan kod yazmayı gerektirir. Java'nın kurucularının, eşleme kodunun sizin yazmanız olmadan parametre-değer eşlemesi sağlamaması gerçeği, Enum Sabitlerinin Java dilinin kasıtsız kullanımı olduğunu gösterir." Fazladan kod yazmadan parametre-değer eşlemesini başka nasıl elde edersiniz?
GabrielOshiro

Arayüz sabitlerini kullanın. KESİNLİKLE.
Geek mübarek

9

Bu eski soruyla birkaç kez karşılaştım ve kabul edilen cevap hala kafamı karıştırıyor. Çok düşündükten sonra, bu sorunun daha da açıklığa kavuşturulabileceğini düşünüyorum.

Neden Arayüz Sabitini kullanmalısınız?

Sadece karşılaştırın:

public final class Constants {

    private Constants() {
        // restrict instantiation
    }

    public static final double PI = 3.14159;
    public static final double PLANCK_CONSTANT = 6.62606896e-34;
}

vs

public interface Constants {

    double PI = 3.14159;
    double PLANCK_CONSTANT = 6.62606896e-34;
}

Aynı kullanım. Çok daha az kod.

Kötü uygulama mı?

Sanırım @Pascal Thivent'in cevabının yanlış vurgusu var, işte benim versiyonum:

Statik üyeleri bir arabirime koymak ( ve bu arabirimi uygulamak ) kötü bir uygulamadır.

Etkili Java'dan alıntı, sürekli arayüzün başkaları tarafından uygulandığı varsayımına sahiptir, ki bunun olmaması gerektiğini (ve olmayacağını) düşünüyorum.

Gibi bir adla sabit bir arayüz oluşturduğunuzda Constants, hiç kimse tarafından uygulanmamalıdır. (teknik olarak mümkün olsa da, buradaki tek sorun budur)

Standart kitaplıkta olmayacak

Standart kütüphane, tasarımın herhangi bir olası kötüye kullanımını karşılayamaz, bu yüzden orada hiçbirini göremezsiniz.

Ancak yaklaşık endişe gerekmez, çünkü sabitler arayüzü kullanarak, normal geliştiricilerin günlük projeler için çok daha kolaydır static, final,empty constructor vb ve herhangi kötü bir tasarım sorunu neden olacak DEĞIL. Aklıma gelen tek dezavantajı hala "arayüz" ismine sahip olması, ama bundan daha fazlası değil.

Asla bitmeyen tartışma

Sonunda sanırım herkes kitaplardan alıntılar yapıyor ve standlarına fikir ve gerekçeler veriyor. Benim için istisna yok. Belki de karar yine de her projenin geliştiricisine bağlıdır. Kendinizi rahat hissediyorsanız kullanmaya devam edin. Yapabileceğimiz en iyi şey, onu proje boyunca tutarlı hale getirmektir .


"Statik üyeleri bir arabirime yerleştirmek (ve bu arabirimi uygulamak) kötü bir uygulamadır." Hayır değil
Raining

Değiştirici public, bir arayüz olduğu için ihmal edilebilir, bu da onu basitçe yapar. double PI = 3.14159;Kullanımı arayüzü Constants.PIuygulamak için bunu kullanan sınıfa ihtiyaç duymaz Constants! Arayüz yaklaşımının kullanım açısından çok daha temiz olduğunu düşünüyorum, IMHO
krozaine

@krozaine Güncellendi. Hatırlatma için teşekkürler. Şüphe duyan herkes için referans: "Bir arayüzde tanımlanan tüm sabit değerler örtük olarak genel, statik ve nihai değerlerdir." - docs.oracle.com/javase/tutorial/java/IandI/interfaceDef.html
Nakamura

6

Joshua Bloch, "Etkili Java - Programlama Dili Kılavuzu":

Sabit arayüz modeli, arayüzlerin kötü kullanımıdır. Bir sınıfın bazı sabitleri dahili olarak kullandığı bir uygulama detayıdır. Sabit bir arabirim uygulamak, bu uygulama ayrıntısının sınıfın dışa aktarılan API'sine sızmasına neden olur. Sınıfın sabit bir arabirim uygulamasının bir sınıfın kullanıcıları için hiçbir önemi yoktur. Hatta kafalarını karıştırabilir. Daha da kötüsü, bir taahhüdü temsil eder: eğer gelecekteki bir sürümde sınıf, artık sabitleri kullanmaya gerek kalmayacak şekilde değiştirilirse, ikili uyumluluğu sağlamak için yine de arabirimi uygulamalıdır. Son olmayan bir sınıf sabit bir arabirim uygularsa, tüm alt sınıflarının ad alanları arabirimdeki sabitler tarafından kirletilir.


Daha önce söylenmemiş hiçbir değeri gerçekten eklemediniz.
Donal Fellows


2

Çok yankılanan cevaplar var.

Ama bu soru hakkında bazı düşüncelerim var. (yanlış olabilir)

Bana göre, bir arayüzdeki alanlar tüm proje için sabit olmamalı, sadece arayüz için araçlar ve arayüzler onu genişletiyor ve bu arayüzleri uygulayan veya onlarla yakın ilişki içinde olan sınıflar. Global olmayan belirli bir aralıkta kullanılmaları gerekir.


Gerçekten de bu uygulama sınıfları içinde kullanılmaları gerekir.
Raining

2

Arayüzle ilgili iki nokta:

  • Bir arayüz, onu uygulayan bir nesnenin yapabileceklerinin bir alt kümesini tanımlar . (Bu sezgi)

  • Bir arayüz, onu uygulayan nesnelerin izlediği ortak sabitleri tanımlar .

    • Bu ortak sabitlerin , bu nesneler hakkında daha fazla bilgi sahibi olması için istemci tarafından bilinmesi amaçlanmıştır .
    • Bu nedenle Sabitler Arayüzü , global sabitleri tanımlamak için gerçekten de sezgiseldir , çünkü arayüz bazı nesneleri tanımlamak için kullanılır , tüm nesneleri / hiçbir nesneyi değil ( global anlamını düşünün ).

Bu yüzden Sabitler Arayüzü global sabitler için kullanılmazsa , kabul edilebilir olduğunu düşünüyorum:

  • Bu ortak sabitlerin iyi isimleri varsa, uygulayıcıya bunları kullanmasını tavsiye ederler (Aşağıdaki Örnek için ilk noktama bakın)
  • Bir sınıf, belirtimi izleyerek bu sınıflarla senkronize olmak istiyorsa, sadece implementsonu (ve tabii ki, uygulamada bu ortak sabitleri kullanın).

Misal:

interface Drawable {

    double GOLDEN_RATIO = 1.618033988;
    double PI = 3.141592653;
    ...

    // methods
    ...
}

public class Circle implements Drawable {
    ...
    public double getCircumference() {
        return 2 * PI * r;
    }
}

void usage() {

    Circle circle = new Circle(radius: 3.0);
    double maxRadius = 5.0;

    if ( circle.getCircumference() < 2 * Circle.PI * maxRadius ) {
        ...
    }

}

Bu örnekte:

  • Buradan Circle implements Drawable, Circlebunun muhtemelen içinde tanımlanan sabitlere uygun olduğunu hemen anlarsınız Drawable, aksi takdirde iyi olanlardan daha kötü bir isim seçmeleri gerekir PIve GOLDEN_RATIOzaten alınmışlardır!
  • Sadece bu Drawablenesneler belirli PIve GOLDEN_RATIOtanımlanmış olana uygundur , farklı pi ve altın oran hassasiyetine sahip Drawableolmayan nesneler olabilir Drawable.

Cevabınızı yanlış mı anladım yoksa Arayüzün amacını mı yanlış anladınız? Arayüz bir alt küme OLMAMALIDIR. Arayüz bir sözleşmedir ve sözleşmeye abone olan kişi o sözleşmede belirtilen etkileşimi sağlamalıdır. Arayüzün tek geçerli kullanımı, bir sözleşmeyi beyan etmek / yerine getirmek için kullanmaktır.
Geek Ne mutlu

@BlessedGeek Bir sözleşmeyi yerine getirirseniz, sözleşmede tanımlanan yetenek, yapabileceklerinizin bir alt kümesidir.
Raining

1

javax.swing.SwingConstantsArayüz salıncak sınıflar arasında kullanılan statik alanlar var bir örnektir. Bu, aşağıdaki gibi bir şeyi kolayca kullanmanızı sağlar

  • this.add(LINE_START, swingcomponent);
  • this.add(this.LINE_START, swingcomponent); veya
  • this.add(SwingComponents.LINE_START, swingcomponent);

Ancak bu arayüzün yöntemleri yok ...


1

Bu soruyla karşılaştım ve bahsedilmeyen bir şey ekleyeceğimi düşündüm. Genel olarak, buradaki Pascal'ın cevabına katılıyorum . Ancak, bir arayüzdeki sabitlerin "her zaman" bir anti-model olduğunu düşünmüyorum.

Örneğin, tanımladığınız sabitler o arayüz için bir sözleşmenin parçasıysa, arayüzün sabitler için harika bir yer olduğunu düşünüyorum. Bazı durumlarda, sözleşmeyi uygulamanızın kullanıcılarına ifşa etmeden parametrelerinizi özel olarak doğrulamak uygun değildir. Herkese açık bir sözleşme olmadan, kullanıcılar, sınıfı yeniden derlemeden ve kodunuzu okumadan sadece neyle doğruladığınızı tahmin edebilir.

Dolayısıyla, bir arabirim uygularsanız ve arabirim, sözleşmelerinizi sağlamak için kullandığınız sabitlere sahipse (örneğin, tamsayı aralıkları gibi), sınıfınızın bir kullanıcısı arabirimdeki sabitleri kontrol ederek arabirim örneğini doğru şekilde kullandıklarından emin olabilir. kendilerini. Sabitler uygulamanıza özel olsaydı veya uygulamanız pakete özel veya başka bir şey olsaydı bu imkansız olurdu.


1
Arayüzler ve sabitlerle ilgili problemi tarif ettiğiniz şekilde, bir arayüze sabit ekleyebilirsiniz, ancak API'nizin tüketicisini bu sabiti kullanmaya zorlayan hiçbir bağlama yoktur.
Daniel

@Daniel: Yorumunuza olumlu oy verdim, ancak şimdi sorunuz için iyi bir açıklamam var: "API'nizin tüketicisini bu sabiti kullanmaya zorlayan bir bağlayıcı yok" ancak artık müşteri CONSTANT_NAME özelliğini artık kullanamıyor çünkü kullanılmış, bu benim için iyi bir işaret!
Raining

Yani, sabit isim sınıfınızda mevcut değil, ama bu, sabiti tamamen aynı şekilde adlandıracağımı varsayıyor. Sabitleri temsil etmek için bir arayüz kullanmak hala bir yanılgıdır, bir arayüz bir API için bir sözleşmedir. Sabit değerleri temsil etmek için kesinlikle kullanılmamalıdır.
Daniel

-1

Sınıflar arasında paylaşılan sabitlerle uğraşırken arayüz sabitlerini kullanıyorum.

public interface TestConstants
{
    String RootLevelConstant1 = "RootLevelConstant1";

    interface SubGroup1
    {
        String SubGroupConstant1 = "SubGroup1Constant1";
        String SubGroupConstant2 = "SubGroup1Constant2";
    }

    interface SubGroup2
    {
        String SubGroupConstant1 = "SubGroup2Constant1";
        String SubGroupConstant2 = "SubGroup2Constant2";
    }
}

Gruplama, özellikle büyük bir sabit setiyle büyük bir varlıktır.

Kullanmak için onları birbirine zincirlemeniz yeterlidir:

System.out.println(TestConstants.SubGroup1.SubGroupConstant1);
System.out.println(TestConstants.SubGroup2.SubGroupConstant1);
System.out.println(TestConstants.RootLevelConstant1);

Katılıyorum. Temelde, genel statik son alanları olan public soyut sınıfla aynı şeyi yapar, ancak çok daha az sözcükle. İhtiyacınız olan tek şey, ekibinizdeki tüm geliştiricilerin iyi uygulamaları takip etmesini ve bu arayüzleri uygulamamasını sağlamaktır.
Yahor

1
Bu korkunç çünkü Sınıflarla tamamen aynı şeyi yapabilir, aynı şekilde erişebilir, ayrıca sınıfları son haline getirebilir ve kurucularını özel hale getirebilirsiniz (eğer gerçekten sadece bir çanta dolusu sabit istiyorsanız). Ayrıca, sınıfınızı uzatan insanlardan kaçınırsınız. İnsanların arayüzünüzü uygulamalarını engelleyemezsiniz, değil mi?
GabrielOshiro

1
Neden bir sınıfta bir arayüzde yapabildiğinizi? İnsanların istemeden HERHANGİ bir arayüzü uygulamalarını nasıl engelleyebilirim sorusu. Neden arayüz sabitlerini seçiyorsunuz?
Geek Ne mutlu

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.