Java 如何隐藏公共方法?

Java 如何隐藏公共方法?,java,annotations,scope,public-method,Java,Annotations,Scope,Public Method,我的静态机器中有一个方法,在应用程序第一次启动时只使用一次。该方法需要公开,但我仍然希望将其隐藏。有没有一种方法可以使用注释或其他东西对项目的其余部分隐藏该方法?另一种解决方案:您可以将其设置为私有,并创建一个invokeHiddenMethod(String methodName,Object…args)使用反射的方法。一旦声明了公共方法,它就成为类契约的一部分。您不能隐藏它,因为所有类用户都希望此方法可用 嗯。。。您想要一个私有方法,但想在外部访问它 试着用反射来做这件事。 不能隐藏公共方法

我的静态机器中有一个方法,在应用程序第一次启动时只使用一次。该方法需要公开,但我仍然希望将其隐藏。有没有一种方法可以使用注释或其他东西对项目的其余部分隐藏该方法?

另一种解决方案:您可以将其设置为私有,并创建一个
invokeHiddenMethod(String methodName,Object…args)
使用反射的方法。

一旦声明了公共方法,它就成为类契约的一部分。您不能隐藏它,因为所有类用户都希望此方法可用

嗯。。。您想要一个私有方法,但想在外部访问它

试着用反射来做这件事。

不能隐藏公共方法(除非可以将其声明为私有)。但是,您可以放入子类,只让对象的用户知道超类的类型,即:

class A {
   //Externally visible members
}

class B extends A {
   //Secret public members
}

然后实例化类B,但只让其他人知道类型A…

您可以使用包级别而不是公共级别。这样,它只能由您的应用程序调用。

您说过,当应用程序启动时,您的公共方法只使用一次

也许您可以将该方法保留为公共的,但在第一次调用后不执行任何操作?

存在(非)关键字级别的包级别可见性。您不使用任何东西,而使用公共的、受保护的或私有的


这将使类和包中的其他人可以看到方法或类,但会给您一定程度的隐私。您可能想看看。

我见过许多Java程序员做过这样的事情:

public static void main(String args[]) {
      new MyClass();
}
public class SimpleStateMachine {

    static {
        System.out.println("First time tasks #1");
        System.out.println("First time tasks #2");
    }

    public SimpleStateMachine() {
        super();
        System.out.println("Welcome to the machine");
    }

    public void doUsefulThings() {
        System.out.println("Doing useful things");
    }
}

所以基本上他们只创建类的一个对象。如果有一种方法只能运行一次,我想这种方法可以实现这一点。将从构造函数内部调用您的方法。但是因为我不知道你的应用程序是如何工作的,有什么限制,所以这只是一个想法。

如果一个方法是公共的,它就不能隐藏。您可能真正想要的只是限制调用方法的访问权限的一种方法。还有其他方法可以达到类似的效果

如果您的状态机所做的某些事情“在我的应用程序第一次启动时只使用一次”,那么听起来很像是构造函数中可能发生的事情。尽管这取决于这些任务有多复杂,但您可能不希望在构建时这样做

既然你说你的状态机是静态的,它也是一个单态的吗?你也许可以用这个

以下是此单例客户端的一些代码:

public class MachineCaller {

    static SimpleStateMachine machine = SimpleStateMachine.getInstance();

    public static void main(String... args) {
        System.out.println("Start at the very beginning");  // prints 2nd
        machine.doUsefulThings();
    }
}
请注意,
SimpleStateMachine
实例直到第一次访问类时才生成。因为它在
MachineCaller
客户机中声明为
static
,所以它被视为“第一次访问”,并创建实例。如果您确实希望您的状态机在应用程序启动时执行某些初始化任务,请记住这一点

所以,如果你不想把你的状态机类变成一个真正的单例。。。第一次访问类时,可以使用一个按钮来执行一次性任务。看起来是这样的:

public static void main(String args[]) {
      new MyClass();
}
public class SimpleStateMachine {

    static {
        System.out.println("First time tasks #1");
        System.out.println("First time tasks #2");
    }

    public SimpleStateMachine() {
        super();
        System.out.println("Welcome to the machine");
    }

    public void doUsefulThings() {
        System.out.println("Doing useful things");
    }
}

既然你提到它是一个状态机。。。这本书很好地处理了这个问题,很容易理解。如果您还没有读过,我建议您阅读。

这样做的惯用方法是使用接口来限制方法的可见性

例如,假设您有以下类:

public class MyClass {
    public void method1() {
        // ...
    }
    public void method2() {
        // ...
    }
}
如果您想将项目的某些部分限制为只查看
method1()
,那么您要做的是在接口中描述它,并让类实现该接口:

public interface Method1Interface {
    public void method1();
}

...

public class MyClass implements Method1Interface {
    public void method1() {
        // ...
    }
    public void method2() {
        // ...
    }
}
然后,您可以通过选择将类作为
MyClass
引用或
Method1Interface
引用传递来限制方法的可见性:

public class OtherClass {
    public void otherMethod1(MyClass obj) {
        // can access both obj.method1() and obj.method2()
    }
    public void otherMethod2(Method1Interface obj) {
        // can only access obj.method1(), obj.method2() is hidden.
    }
}
这种方法的一个好处是它也可以很容易地扩展。例如,您现在还希望独立控制对
method2()
的访问。您所需要做的就是按照与
Method1Interface
相同的行创建一个新的
Method2Interface
,并让
MyClass
实现它。然后,您可以使用与
method1()
完全相同的方式控制对
method2()的访问

这与中提倡的方法类似,但更加灵活:

  • 由于Java不支持多重继承,使用Mathias的技术无法实现上一段中描述的独立访问控制
  • 不需要继承关系也允许在设计类层次结构时具有更大的灵活性
  • 对原始类的唯一更改是添加
    implements Method1Interface
    ,这意味着它是一个影响非常小的重构,因为
    MyClass
    的现有用户根本不需要更改(至少在选择将其更改为使用
    Method1Interface
    之前)

也许可以给它起个明显的名字——比如OnlyUseThisOnStartup();你为什么希望它既公开又隐藏?换句话说,这对您有什么好处?如果第二次调用该方法,请使该方法引发异常?该方法在何处可见,在何处隐藏?也许
default
可以吗?如果它是一个初始值设定项,就把它放在
static{}
块中。@Randy&Mannimarco-我可以同时做这两件事,这是最简单的解决方案,我只是好奇是否有一个微妙的解决方案。不要用反射来破解这个问题。如果你诉诸于这种虐待,它会回来并在你的余生中困扰你……这不是一种反思黑客。这是一个合法的OOP设计。是的,这是对我自己帖子的评论。我只是建议大家不要在这一页上提出反思黑客攻击