2012-04-05 71 views
1

我有一个非常大且臃肿的类,我想将它分成单独的文件,但它应该对用户完全透明,并与使用该类的现有项目兼容。

特别是我有我自己的ImageMatrix类,它定义了一吨一元函数,一吨标量二进制函数,一吨二元函数与另一幅图像等。为了保持类的清洁和可维护性,我希望把每一类操作符放在一个单独的文件中。

有没有办法将这些方法剪切/粘贴到文件中并将它们包含在源代码中?

所以我希望我还是能做到这一点,但实际上方法驻留在不同的文件中:

ImageMatrix img = new ImageMatrix(800, 600, 3); 
    img.clear(0.5f, 0.0f, 0,0f); 
    img.addSelf(anotherImg); 
    img.normalize(); 
    img.abs(); 
    img.addSelf(0.5); 

每种方法都是15-30左右的代码行,因为这些实现性能极为优化,就像无法用Bufferedimage或者简单的int []来实现一样。有很多代码重复,这是将类似的方法组合在一起的主要原因。如果我添加一个函数,或者如果我改变全局行为(如错误检查),我可以很容易地保持一致。

回答

1

您也可以使用委托方法。这意味着您的方法的定义仍然在ImageMatrix中,但它们在另一个类中实现。根据您的方法的复杂程度,这可能会减少ImageMatrix中的代码量。

class ImageMatrix { 

    MatrixHelperOne helperOne = new MatrixHelperOne(); 

    ... 

    public void complexMethod1(Arg arg) { 
     helperOne.complexMethod1(arg); 
    } 

    ... 
} 
+1

这听起来像是最好的方法。我将使用ImageMatrix中的静态方法创建外部类。 – 2012-04-05 08:53:33

2

不幸的是,将Java类定义分成多个文件是不可能的。

尝试重构您的代码,以便不需要巨大的类定义。通常这意味着通过getter和setter方法暴露某些状态,并编写使用这些方法向主类添加功能的支持类。

对于你的情况,你可能会考虑添加支持类如ImageFilters,或者甚至像ImageNormalizer那样更窄的东西,如果你喜欢非常小的类。

+2

我不认为“不幸”在这方面是一个合适的词。 – bezmax 2012-04-05 08:43:18

+0

在少数情况下,它会很方便,比如内联方法在编译时调用的虚拟机代码至关重要。 – 2012-04-05 08:47:46

1

不能跨文件拆分java类。你可以做的是,如果你的每个方法都是自包含的,你可以用静态方法创建类。因此,在一定程度上,您需要做的只是剪切和粘贴代码。

+0

我想过,但它对用户不透明。然而,根据phlogratos的回答,我无论如何都做了这个,但是也在主类中做了委托方法,所以它变得透明。 – 2012-04-05 11:37:48

+0

@ Zom-B:是的,这就是为什么我在某种程度上提到过。然后你必须为所有东西实现一个大的包装类。 – npinti 2012-04-05 11:52:42

1

那么,你可以创建一个更通用的类,并把更通用的方法,然后有ImageMatrix扩展那一个。另外,如果你有很多矩阵操作函数,你可能会得到很多代码重复,也就是说,用不同的方法重复相同的代码,而不是将普通代码移动到aux方法并从不同的地方调用它等等。