java部分类

时间:2010-03-23 16:30:53

标签: java code-generation language-features

小序言。我是1.4 jdk的优秀java开发人员。在它之后,我已经切换到另一个平台,但在这里我遇到了问题所以问题强烈关于jdk 1.6(或更高:))。我有3个耦合类,与本机方法有关的耦合性质。贝娄是这3级的例子

public interface A
{
     public void method();
}
final class AOperations
{
     static native method(. . .);
}
public class AImpl implements A
{
    @Override
    public void method(){ 
        AOperations.method( . . . );
    }
}

所以有接口A,它由AOperations以本机方式实现,而AImpl只是将方法调用委托给本机方法。 这些关系是自动生成的。一切都好,但我有问题。有时像A这样的接口需要暴露迭代器功能。我可以影响接口,但不能改变实现(AImpl)。

在C#中说我可以通过简单的局部解决问题: (C#样本)

partial class AImpl{
 ... //here comes auto generated code
} 

partial class AImpl{
 ... //here comes MY implementation of 
 ... //Iterator 
} 

所以,有部分或类似的java模拟。

EDITED : 根据@pgras的评论,我需要一些澄清。 AImpl不在真空中,有一些工厂(本机实现)返回AImpl的实例,这就是为什么从AImpl创建继承不适用。

已编辑2 : 可能它没有关系,但它是如何由JUnit 4完成的:

public class SomeTest {
 ...
 //there is no direct inheritance from Assert, but I can use follow:
 assertTrue(1==1); //HOW DOES it works??

3 个答案:

答案 0 :(得分:8)

Java不支持partials或open类。其他JVM语言可以,但不是Java。在您的示例中,最简单的事情可能是使用委托。您可以让AImpl使用另一个实现这些扩展方法接口的对象。生成的AImpl将生成方法,例如迭代器方法,它可以委托给您传入的用户创建的对象。

答案 1 :(得分:2)

How about that: 
Compute.java  =    your class
Compute$.java  =   base class for partial classes. Reference a Compute object
Compute$Add.java = your partial class. Subclass Compute$.
Compute$Sub.java = your partial class. Subclass Compute$.

文件Compute.java

public class Compute {
    protected int a, b;
    Compute$Add add;
    Compute$Sub sub;

    public Compute() {
        add = new Compute$Add(this);
        sub = new Compute$Sub(this);
    }

    public int[] doMaths() {
        int radd = add.add();
        int rsub = sub.sub();
        return new int[] { radd, rsub };
    }
}

file Compute $ .java

public abstract class Compute$ {
    protected Compute $that;
    public Compute$(Compute c){
        $that=c;
    }
}

file Compute $ Add.java

public class Compute$Add extends Compute$ {
    public Compute$Add(Compute c) {
        super(c);
        // TODO Auto-generated constructor stub
    }

    public int add(){
        return $that.a+$that.b;
    }
}

file Compute $ Sub.java

public class Compute$Sub extends Compute$ {
    public Compute$Sub(Compute c) {
        super(c);
    }

    public int sub() {
        return $that.a - $that.b;
    }
}

答案 2 :(得分:1)

你可以扩展A(比如接口B扩展A)并扩展AImpl并实现B(类BImpl扩展AImpl实现B)......