Sınıf erişim değiştiricisinden daha az kısıtlayıcı üye erişim değiştiricilerinin kullanımı nedir?


9

Bazı üyelerle bir sınıfım olduğunu ve üyelerin sınıfın kendisinden daha az kısıtlayıcı erişim değiştiricisine sahip olduğunu varsayalım.

Somut bir örnek şunlar olabilir:

package apples;

class A { // package private
    public int foo() { // public (=> less restrictive than *package private*)
        return 42;
    }
}

Anladığım kadarıyla üye erişim değiştiricisinden daha kısıtlayıcı olan bir sınıf erişim değiştiricisi , daha az kısıtlayıcı üye erişim değiştiricilerini geçersiz kılar . Dolayısıyla, daha az kısıtlayıcı bir üye erişim değiştiricisinin hiçbir etkisi olmamalıdır.

  • Anlayışım doğru mu?
    • Değilse, sonuçları nelerdir?
  • Daha az kısıtlayıcı üye erişim değiştiricilerinin olması için geçerli nedenler neler olabilir?
  • Son olarak, izlenecek en iyi uygulamalar nelerdir?

Ayrıca bazı deneyler yaptım çünkü fonksiyon referanslarını geçmeye başladığımda sonuçları olabileceğini düşündüm, ancak o zaman bile erişim değiştirici önemli görünmüyor.

İnşa ettiğim durum şudur:

  • apples.B, bla()başvuruyu döndüren genel bir yöntem sağlar apples.A.foo.
  • Daha sonra pizzas.Caramalar apples.B.blaiçin bir başvuru elde etmek için A.foove bunu çağırır.
  • Bu yüzden A.foo()doğrudan görünmez C, ancak yalnızca dolaylı olarakB.bla()

Test ettim ve foo() paketin erişim değiştiricisini özel yapmam ya da yapmamam fark etmiyor.

package apples;

import java.util.function.IntSupplier;

public class B {
    public IntSupplier getReferenceToAFoo() {
        A aInstance = new A();
        return aInstance::foo;
    }
}
package pizzas;

import apples.B;

import java.util.function.IntSupplier;

public class C {
    private int callAFooIndirectly() {
        B bInstance = new B();
        IntSupplier intsupplier = bInstance.getReferenceToAFoo();
        return intsupplier.getAsInt();
    }

    public static void main(String[] args) {
        C cInstance = new C();

        int i = cInstance.callAFooIndirectly();
        System.out.println(i);
        assert 42 == i;
    }
}

2
Bu tür bir tasarımın açık ara en yaygın nedeni, genel olmayan sınıfları kullanarak genel API yöntemlerinin (arayüzlerden veya genişletilmiş soyut sınıflardan olanlar gibi) uygulamalarını sağlamaktır. (Ex: JDK kendisi bu sınıflar ile doludur java.util.Collections.SingletonSet<E>olup privateiçinde java.util.Collections).
ernest_k

Yanıtlar:


8

Anlayışım doğru mu?

Evet.

Daha az kısıtlayıcı üye erişim değiştiricilerinin olması için geçerli nedenler neler olabilir?

İki sebep:

  • Bazen bir arayüz uyguluyorsunuz; arayüz yöntemleripublic
  • Sınıfınızın genel erişimini değiştirmeyi kolaylaştırır. Örneğin, publicbir paket-özel sınıfta bile herkese açık olmasını istediğiniz tüm yöntemleri işaretlerseniz , daha sonra sınıfı herkese açık hale getirmek için yapmanız gereken tek şey publicsınıf bildirimine eklemektir .

Son olarak, izlenecek en iyi uygulamalar nelerdir?

Bu bir görüş meselesidir, bu nedenle Yığın Taşması sorusu veya cevabı için çok uygun değildir. Size ve / veya ekibinize makul gelenleri yapın ve / veya ekibinizin stil rehberinin size söylediklerini yapın.

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.