假设我有Person类。一个人可以有年龄,也可以有车。我希望只有当用户使用构造函数Person(int age, boolean hasCar)时,才能使方法getCar()对用户可用。因此,如果他用Person(int age)创建了一个Person对象,那么getCar方法应该是不可访问的。有没有办法做到这一点?即隐藏getCar()方法。我希望在不使用继承的情况下做到这一点。
发布于 2015-05-15 02:51:36
不,这是一件好事。
可能调用Person.car()的代码不一定知道在编译时如何在运行时构造。这个人可能是由完全独立于另一个源文件、另一个包或另一个库编译的代码创建的。
当一个人没有车时,你可以用Person.getCar()做什么,是下面的一种:
或者,如果允许继承,则可以同时拥有Person类和PersonWithCar类,并使用instanceof来区分它们。但是,如果您遵循这种方法,并且具有多个HAS-A属性,那么它很快就会扩展为许多类。
发布于 2015-05-15 02:56:07
简而言之:你不能,你甚至不应该尝试。
当您调用一个类的构造函数时,您已经选择了要实例化的对象类型。即使可能的话,之后更改对象/类也只是一种肮脏的技巧。而肮脏的黑客应该永远是最后的手段。
实现您可能想要的功能的典型方法是有两个类Person和AdultPerson,后者是前者的子类,只有第二个类具有getCar()方法。
然后根据person的年龄使用factory pattern创建Person或AdultPerson对象。
然而,我不相信这是一个好的设计,因为--好吧--人老了,因此您可能会突然面临将Person转换为AdultPerson的问题。
在Person类中不包含hasCar()、getCar()和canHaveCar(),而只是返回null或在未成年人员上调用getCar()时引发异常的理由是什么?
发布于 2015-05-15 02:46:16
因此,首先,这绝对不是处理这个问题的标准方法。通常,建议将是两件事中的一件。两个人中的任何一个都有能力引用汽车,或者有一个知道汽车的子类(比如CarOwner),但仍然是Person的一个实例
但话虽如此,你能隐藏基于构造函数的方法吗?可以通过反射获取实例,找到所需的方法,并在运行时更改方法的可见性。虽然这不仅仅是一个答案,而且很可能这样做的可见性更改(如果JVM甚至允许的话)将应用于类的所有实例。
另一种选择可能是基于构造函数在运行时缩短方法,这样如果使用了错误的构造函数,您总是返回null、抛出异常或类似的东西。
https://stackoverflow.com/questions/30244876
复制相似问题