Java中与程序包相对的标识符路径

介绍

从C ++开始,最大的区别之一是作用域的不同:在C ++中,每个标识符都相对于当前范围(class或namespace),您可以::在开始时使用范围解析运算符编写一个绝对路径。


但是,在Java中,如果不将标识符导入当前作用域或编写其完整路径,就无法找到从其他包访问标识符的方法。


如果我有几个同名的类,那么这可能是一个问题(然后,在C ++中,我将它们分别命名为Module1 :: Foo和Module2 :: Foo,这在Java中是不可能的,只要我想保持理智即可。因为com.company.project.module1.Foo对于我的品味来说太长了)。


代码!

这是一个Tools.Useless.Foo从Java和C ++访问类的示例(不带import或using)


Tools/Useless/Foo.hpp:


namespace Tools {

namespace Useless {

class Foo {         

};

}

}

Tools/Bar.hpp


namespace Tools {

...

// Use Foo with a relative identifier

Useless::Foo foo;

// Use Foo with an absolute identifier.

::Tools::Useless::Foo bar;

...

这就是在Java中的样子:


com/company/project/Tools/Useless/Foo.java:


package com.company.project.Tools.Useless;


public class Foo { }

com/company/project/Tools/Bar.java:


...

// Use Foo with a relative identifier

???

// Use Foo with an absolute identifier.

com.company.project.Tools.Useless.Foo foo;

...

问题

  1. 有没有一种方法可以Foo从软件包中访问Tools.Useless而无需指定Tools.Useless完整的软件包名称(并导入它;因为导入会将其绑定到当前作用域)?

  2. 我做对了吗?我应该如何使用几个同名的类?我应该避免这种情况,还是只使用“ package。*”将其导入以绕过它?

解决方案

  1. 使用更多的包描述类名(例如ToolsUselessFoo而不是Foo)。

  2. 使用import path.to.module.*而不是导入所有内容,import path.to.module.Foo然后访问Foo所需的软件包以解决任何歧义。问题在于有时包名称具有含义(例如Tools.Useless.FooTools.Useful.Foo)。


函数式编程
浏览 173回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java