公共Java类的命名与文件不同

时间:2011-12-26 17:35:28

标签: java

在其中一个大学课程中,我们必须用Java开发程序。其中一个要求是使用模式surname_firstname_exerciseN_className.java命名所有文件。另一个要求是我们必须将程序拆分成多个文件。你可以想象,这两者并不能很好地融合在一起。

我正试图通过“翻译”我的班级名称来解决这个问题。例如,如果我写一个名为“Something”的类,我会在long_prefix_something.java文件中执行此操作:

public class long_prefix_something extends Something {}

class Something {
    // class code
}

我想在另一个文件中使用class Something。所以我在其他文件中执行此操作:

class Something2 extends long_prefix_something { }

令我困扰的是,由于循环继承错误,我无法将long_prefix_something翻译回Something,我必须改为使用Something2

无论如何要克服这个问题?要使用的任何注释或类似的东西吗?

4 个答案:

答案 0 :(得分:1)

此类黑客的必要性通常是糟糕设计的标志。 java中不允许循环(和多个)继承。

答案 1 :(得分:1)

我同意(与其他评论者一样)这对我来说听起来有点吓人......但是,在那里,存在一些用于处理类似于你的问题的java惯例。

您似乎需要对其内部“更具描述性”的类 派生然后继承层次结构中的标准java类。

您可以通过两种标准方式满足您的需求:接口(编译时)或反射(运行时)。

虽然确切的解决方案不明确,因为您似乎在这里有一个非常复杂的代码方案, 这两个例子可以解决您遇到的问题:

第一种方法:使用接口。

1)将“Something”转换为界面 2)从中获取implmentation方法并将它们移植到SomethingImpl类 3)只需要“abcde12345_something”实现“Something”界面。

第二种方法:使用内省方法。

这是一种有点奇怪的方法,但是如果接口不起作用,你可以在你的类中添加更多钩子,允许它描述其他对象, 它是从哪种类型派生出来的。

1)很明显,你正在“包装”类 - 所以,你可以为你的包装类添加一个API,这样每个类都提供一个“getRootClass()”方法,如下所示:

public class abcde_12345_something extends Something implements RootClassProvider{
    public Class getRootClass()
    {
         return Something.class;
    }
}

2)现在,在runTime - 如果你不能(出于某种原因)需要对“Something”对象进行特殊的逻辑操作,你可以 致电

if(myabcd_12345.getRootClass().isAssignableFrom(Something))
    Something s = (Something) myabcd_12345; 

答案 2 :(得分:1)

我认为做他们打算做的最好的方法是使用包,而不是混淆类名......如果我是你,我建议你的老师:

即。 surname_firstname.exerciseN.ClassName而不是surname_firstname_exerciseN_className.java

答案 3 :(得分:0)

不,这在Java中是不可能的。

扩展将无效,并且Java中似乎不存在您想要的别名。