有没有办法在基于构造函数的java中隐藏方法?

时间:2015-05-14 18:40:37

标签: java

假设我有班级Person。一个人可以有年龄或汽车。仅当用户使用构造函数getCar()时,我才想让方法Person(int age, boolean hasCar)可供用户使用。因此,如果他使用Person(int age)创建了一个Person对象,那么方法getCar就不可访问。有没有办法做到这一点?即隐藏getCar()方法。我想在不使用继承的情况下这样做。

4 个答案:

答案 0 :(得分:3)

不,这是的事情。

可能调用Person.car()的代码不一定在编译时知道 如何在运行时构建Person 。 Person可能是由与另一个源文件,另一个包或另一个库分开编译的代码创建的。

Person.getCar()所做的事情,当此人没有车时,是以下之一:

  • 返回null
  • 返回魔术值
  • 抛出异常(最好使用hasCar()方法,以允许正常执行以避免抛出异常)。

或者,如果您允许继承,则可以同时拥有Person类和PersonWithCar类,并使用instanceof来区分它们。但是,如果您使用多个HAS-A属性来遵循此方法,它会很快爆炸成许多类。

答案 1 :(得分:2)

简短的回答:你不能,你甚至不应该尝试。

当您调用类的构造函数时,您已经选择了要实例化的对象类型。之后更改对象/类是 - 如果可能的话 - 只是一个肮脏的黑客。肮脏的黑客应该永远是最后的手段。

典型的实现你可能想要的方法是拥有两个类PersonAdultPerson,后者是前者的子类,只有第二个类拥有getCar()方法。

然后,您可以使用factory pattern创建PersonAdultPerson个对象,具体取决于此人的年龄。

但是,我并不相信这是好的设计,因为人们年龄太大,因此你可能会突然遇到将Person转换为AdultPerson的问题。 }。

hasCar()课程中没有getCar()canHaveCar()Person并简单地返回null或提出如果未成年人调用getCar(),则会出现异常吗?

答案 2 :(得分:1)

首先,这绝对不是处理这个问题的标准方法。通常,建议将是两件事之一。任何一个人都有能力持有对汽车的引用,或者有一个Person的子类(比如CarOwner)知道汽车,但仍然是人的实例

但是说,你可以隐藏基于构造函数的方法吗?可以通过反射获取实例,找到所需的方法,并在运行时更改方法的可见性。虽然这只是头脑风暴而不仅仅是一个答案,但它可能在这样做的可见性变化(如果JVM甚至允许它)将适用于该类的所有实例。

另一个选项可能是在运行时基于构造函数使方法短路,这样如果使用了错误的构造函数,则总是返回null,抛出异常或类似的东西。

答案 3 :(得分:0)

如果您描述它的方式不可能,如果hasCar为false,您可以使getCar()不执行任何操作,或者无论如何都可以使用继承。