【问题标题】:Is there a way to pass a package private class to static method有没有办法将包私有类传递给静态方法
【发布时间】:2012-08-08 19:43:51
【问题描述】:

我想知道是否有办法从另一个以包私有类作为参数的包中调用静态方法?这是将 MessagePackagePrivate 类移动到另一个 .java 文件并将其公开的唯一方法吗?如果我不这样做,它会给出这个错误:“MessagePackagePrivate 类型不可见”,这是正常的。

那么,如果是这样的话,即使你的类公开了一个要公开使用的静态方法,如果它不在同一个包中调用,就不能使用该类?

这里是sn-p的代码:

MainClass.java

package packageA;

import packageB.*;

public class MainClass {
    public static void main(String[] args) {
        ClassB.printString(new MessagePackagePrivate("Package problem"), 12);
    }
}

ClassB.java

package packageB;

public class ClassB {

    public static void printString( MessagePackagePrivate message , int numbers) {
        System.out.println(message.getMessage() + " numbers: " + numbers );
        // other logics will be implemented here ...
    }
}

    class MessagePackagePrivate {
        private String text;

        MessagePackagePrivate(String text) {
            this.text = text;
        }

        public String getMessage() {
            return this.text;
        }
    }

【问题讨论】:

  • 应该注意pacenter code herekageA 不是一个有效的包名。而是pacenter.code.herekageA。
  • 您的 MessagePackagePrivate 是默认类。默认类不能被自身以外的其他包引用
  • @Sikorski:这不是默认类。这是一个嵌套类。它在包packageB 中。与此包中的其他类相比,它具有不同的可见性。
  • @Makoto 我和 Sikorski 在一起,它不是内部类,它的默认值,一个 java 文件中的两个类。
  • @Makoto 第一次我也认为那是一个内部类,但仔细查看文件,大括号和问题 Op 说,当他将类移动到另一个 java 文件中时,它可以工作,我不要以为你会用嵌套类来做某事

标签: java package static-methods package-private


【解决方案1】:

您可以实现一个接口(例如Printable)并将该接口用作静态方法中的参数类型。

【讨论】:

    【解决方案2】:

    这就是接口的用途。

    您有一个公共接口(好吧,所有接口都是公共的),它定义了所有需要公开访问的方法和一个包私有实现。而你传递对象的方法只需要知道接口。

    你的情况是这样的:

    public interface Message {
      public String getMessage();
    }
    

    然后

    class MessagePackagePrivate implements Message {
       ...
    }
    

    最后:

    public static void printString( Message message , int numbers) {
       ...
    }
    

    【讨论】:

    • 还有接口,Op 必须以某种方式实例化对象,这会产生同样的问题,或者他应该使用一些工厂模式排序!
    • @Sikorski 是的,好点。在这种情况下,ClassB 中的一个简单的createMessage( String text ) 方法就可以了。
    猜你喜欢
    • 2020-04-29
    • 1970-01-01
    • 2019-06-12
    • 1970-01-01
    • 2019-07-30
    • 1970-01-01
    • 2013-11-28
    • 2022-11-11
    • 2013-04-01
    相关资源
    最近更新 更多