首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有没有办法在java中隐藏基于构造函数的方法?

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

Stack Overflow用户
提问于 2015-05-15 02:40:37
回答 4查看 65关注 0票数 2

假设我有Person类。一个人可以有年龄,也可以有车。我希望只有当用户使用构造函数Person(int age, boolean hasCar)时,才能使方法getCar()对用户可用。因此,如果他用Person(int age)创建了一个Person对象,那么getCar方法应该是不可访问的。有没有办法做到这一点?即隐藏getCar()方法。我希望在不使用继承的情况下做到这一点。

EN

回答 4

Stack Overflow用户

发布于 2015-05-15 02:51:36

不,这是一件好事。

可能调用Person.car()的代码不一定知道在编译时如何在运行时构造。这个人可能是由完全独立于另一个源文件、另一个包或另一个库编译的代码创建的。

当一个人没有车时,你可以用Person.getCar()做什么,是下面的一种:

  • return null
  • return a magic value
  • or 抛出异常(最好使用hasCar()方法,以允许正常执行以避免引发异常)。

或者,如果允许继承,则可以同时拥有Person类和PersonWithCar类,并使用instanceof来区分它们。但是,如果您遵循这种方法,并且具有多个HAS-A属性,那么它很快就会扩展为许多类。

票数 3
EN

Stack Overflow用户

发布于 2015-05-15 02:56:07

简而言之:你不能,你甚至不应该尝试。

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

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

然后根据person的年龄使用factory pattern创建PersonAdultPerson对象。

然而,我不相信这是一个好的设计,因为--好吧--人老了,因此您可能会突然面临将Person转换为AdultPerson的问题。

Person类中不包含hasCar()getCar()canHaveCar(),而只是返回null或在未成年人员上调用getCar()时引发异常的理由是什么?

票数 2
EN

Stack Overflow用户

发布于 2015-05-15 02:46:16

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30244876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档