繁体   English   中英

Java局部类

[英]java partial classes

小序言。 我是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模拟。

编辑 :根据@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??

Java不支持局部或开放类。 其他JVM语言也可以,但是Java不可以。 在您的示例中,最简单的事情可能是不幸的是使用委托。 您可以让AImpl接受另一个对象,这些对象实现这些扩展方法的接口。 然后,生成的AImpl将具有生成的方法(例如迭代器方法),可以将其委托给您传入的用户创建的对象。

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 };
    }
}

文件Compute $ .java

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

文件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;
    }
}

文件Compute $ Sub.java

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

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

您可以扩展A(例如,接口B扩展A)并扩展AImpl和实现B(类BImpl扩展AImpl实现B)...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM