2016-01-08 28 views
7

Büyük olan bir android projeyi yeniden yapıyorum. Çalışan lint, JSME sorununu verirDış ve iç sınıflar arasındaki özel üye erişimi. Aşağıdaki örnekÖzel iç sınıfın kurucusu da özel mi?

public class Outer { 
    private Inner mInner = new Inner(); 

    private class Inner {} 
} 

düşünüldüğünde ben sorun çözümünü uygulamak BİLGİLERİ

Name 
    private field Inner mInner 

Location 
    class Outer (default package) 

Problem synopsis 
    Access to private member of class 'Inner' at line 2 

Problem resolution 
    Make 'Inner' constructor package-local 

olsun şu anda ben biraz kafam karıştı

public class Outer { 
    private Inner mInner = new Inner(); 

    private class Inner { 
     Inner() {} 
    } 
} 

için kaynak değiştirir. Şimdiye kadar örnek

public class Outer { 
    private Inner mInner = new Inner(); 

    private class Inner { 
     public Inner() {} 
    } 
} 

Am bu durumda yanlış eşdeğer olacağını düşündük yoksa tüysüz bir konudur?

+0

Olası kopyası [Sınıf, paket özel olarak bildirildiğinde bir kamu kurucuyu bildirmeli miyiz?] (Http://stackoverflow.com/questions/243218/should-we-declare-a-public-constructor-when- sınıf-ilan edilir-as-paketinin-pri) –

+0

bir sınıf özel beyan zaman, bu sınıfa ait her şeyi yok ne yazık ki cricket_007 @ özel – awsome

+0

olur. Partinin tüylerimden şikayet etmemesi gerekmiyor. – tynn

cevap

2

Section 8.8.9 of the Java language specification, "Default constructor" diyor ki: sınıf public, o zaman varsayılan yapıcı dolaylı erişim değiştirici halkı (§6.6) verilir sınıf türünde

; sınıfının korumalı olarak bildirilmiş olması durumunda, varsayılan yapıcı, örtülü olarak erişim değiştiriciyi korumalı (§6.6) verilir; ; Sınıf özel olarak bildirilmişse, varsayılan kurucu örtülü olarak erişim değiştiriciye özel (§6.6) verilir; aksi halde, varsayılan kurucu erişim değiştiricisinin ima ettiği varsayılan erişim olan 'a sahiptir.

1

Sen anlayış yanlış, ama linter özellikle açık olmak değildir ve tavsiye muhtemelen (J2ME değil) Android için ilgili değildir. David açıklandığı üzere

, iç sınıfının örtülü varsayılan yapıcı sınıfının kendisiyle aynı erişim değiştiricisi vardır, ama özel üyeleri aynı derleme birimine (Java dosyası) içinde erişilebilir. Özel kurucudan kaçınmak için bir dil nedeni yok. sınıfları ayrı çıktı dosyası halinde derlenmiş çünkü

Bununla birlikte, dahili olarak, derleyici sınıfları özel üyeler erişim sağlamak için sentetik bir adaptör yöntemleri oluşturmak zorundadır. Bu yöntemlerin çalışma zamanındaki dezavantajı, masaüstü uygulamaları için önemsizdir, ancak J2ME gibi sıkışık bir şey için, bu fark, üyeyi doğrudan erişilebilir hale getirerek (paket kapsamını kullanarak) ortadan kaldırmaya değer olabilir.

Android sınıf dosyaları üzerinde önemli sonrası işlemini gerçekleştirir ve J2ME cihazları gibi kısıtlı olarak Android cihazlar neredeyse değildir. Her iki platformu da hedeflemek için kod yazmıyorsanız, lint yapılandırmasını değiştirirdim.