2017-06-21 98 views
0

我目前正在建设一个Android Studio的模块结构如下所示:android模块 - 如何让变量只能在模块内部访问?

com.example.module 
+--- .activity 
+--- .adapter 
+--- .fragment 
+--- etc. package names 
+--- .view 
+--- InterfaceClass.java 

我打算让InterfaceClass.java是到模块本身的访问的门户“。它的结构大致是这样的:

public class InterfaceClass 
{ 
    private static InterfaceClass instance; 
    private static AppCompatActivity starterAct; 
    public static int sDisplayWidth, sDisplayHeight; 

    public static InterfaceClass getInstance() { 
     if (instance == null) { 
      synchronized (InterfaceClass.class) { 
       if (instance == null) { 
        instance = new InterfaceClass(); 
       } 
      } 
     } 
     return instance; 
    } 

    public void setup(AppCompatActivity starterAct) { 
     this.starterAct = starterAct; 
     this.updateScreenSize() 
    } 

    ... 

    private void updateScreenSize() { 
     WindowManager wm = (WindowManager) this.starterAct.getSystemService(WINDOW_SERVICE); 
     Display display = wm.getDefaultDisplay(); 

     Point size = new Point(); 
     display.getSize(size); 
     sDisplayWidth = size.x; 
     sDisplayHeight = size.y; 
    } 
} 

我的目的是使变量sDisplayWidthsDisplayHeight只有com.example.module模块内部访问及其所有程序包,而不是外部模块。因为使用当前设置,我可以从任何地方调用或设置InterfaceClass.sDisplayWidth,即使在使用模块的应用程序的活动中,我也希望它只能在实例的设置代码中设置,并且只能在模块内使用。

我不认为protected修饰符可以工作,因为它最终不能在模块的包内部访问。

我的问题:我该如何让变量只能在模块中访问?

编辑:澄清,而不是变量是package-private,我希望它是module-private

+0

我可能会误解这个问题,但你在问如何使一个可变的包 - 私人?如果是,请删除public修饰符。 – Kuffs

回答

0

删除访问说明符将使其成为package-private。试试看。

static int sDisplayWidth, sDisplayHeight; 
0

如果我明白你的问题很好,你可以尝试给它package-private访问也就是说,它只会被你的模块,如果它是居住在模块的根,因此不会对外面的类访问访问该模块

那么试试下面这样做使它package-private

public class InterfaceClass { 

private static InterfaceClass instance; 
private static AppCompatActivity starterAct; 
static int sDisplayWidth, sDisplayHeight; 

public static InterfaceClass getInstance() { 
    if (instance == null) { 
     synchronized (InterfaceClass.class) { 
      if (instance == null) { 
       instance = new InterfaceClass(); 
      } 
     } 
    } 
    return instance; 
} 

public void setup(AppCompatActivity starterAct) { 
    this.starterAct = starterAct; 
    this.updateScreenSize() 
} 

... 

private void updateScreenSize() { 
    WindowManager wm = (WindowManager) 
     this.starterAct.getSystemService(WINDOW_SERVICE); 
    Display display = wm.getDefaultDisplay(); 

    Point size = new Point(); 
    display.getSize(size); 
    sDisplayWidth = size.x; 
    sDisplayHeight = size.y; 
} 
} 
+0

这是事情:当我尝试从'com.example.module.fragment'包中访问它时,它无法编译错误消息:“无法从外部包访问”。 – Gensoukyou1337

+0

@ Gensoukyou1337是的,它不能访问嵌套包 –

0

不幸的是,它现在是不可能的。 Java 9中已经发布了新的module system功能,它可能迟早会发布到Android上。

最接近的修饰符是package-private,但它没有将可见性授予嵌套包。

+0

因此,直到Java 9适用于Android,它是不可能的模块私有? – Gensoukyou1337

+0

不幸的是没有。相信我,我也在努力:(你唯一能做的事情就是 - 以一种“包私人”的方式来组织你的包,以最好的方式为你服务 –