强制使用当前包中具有相同名称的另一个包中的类

时间:2011-03-18 15:04:12

标签: java playframework

自从你们帮助我以后,我在编写Java时偶然发现了一个奇怪的“问题”。

我在Play框架中编程。它在许多包中使用了许多同名的类。它使你的代码看起来很漂亮,但我遇到了一个相当讨厌的副作用:

我的控制器包中有一个“用户”类。但当然,“用户”也是一种模式。 当我在另一个控制器中编写时,我需要创建一个新的User对象。

User u = User.find(...);

因为控制器用户没有这样的方法,所以失败了。

如果解决这个问题的唯一方法就是写

,我是否正确
models.users.User u = models.users.User.find(...);

在与Scala爱好者进行一些讨论后,似乎Java无法解决此类问题。或者他错了?

亲切的问候

3 个答案:

答案 0 :(得分:3)

如果我理解你的问题是正确的,如果你这样做:

import models.users.User;

您可以在没有完整包的情况下访问该对象。这假设您不需要控制器和同一类中的模型。

如果你需要两者,那么是的,你必须完全符合(添加包)其中一个。

也就是说,将所有控制器命名为XXXXController(或类似的东西)是一个很好的约定。更一般地说,您自己的代码不应该有2个具有相同名称的不同类。原因是使代码可读性降低,因为一个地方的用户在某种程度上表现,而在另一部分代码中则表现出不同的行为。

因此,最好的解决方案是重命名控制器。

答案 1 :(得分:1)

他是对的。你没有别的办法。

  

它使你的代码看起来很漂亮

我不会这么说。它使我的代码变得错综复杂,难以理解。

答案 2 :(得分:1)

你是对的。如果您需要同时使用控制器中的User和同一类框架中的User类,则可以导入一个,然后使用另一个的完整包名。

这当然会让人感到困惑,我会推荐两件事之一:

1)将您的班级重命名为其他名称。 2)不要导入它们并使用两者的完整包名。这样在阅读代码时就不那么容易混淆了。

我推荐选项1。