Eva
Java粉絲募集中
  • 簡介
  • 我們的優勢
  • 最新消息
  • 下載與使用
  • 範例與說明
    • Eva Objects >
      • Bean類別定義
      • Entity型別定義
      • Struct型別定義
      • 建立Entity空白物件
      • 建立Entity修改物件
      • 建立Entity條件物件
      • 建立Struct值物件
    • Eva_ORM >
      • ORM程式主體
      • 使用條件物件執行操作
      • 執行更複雜條件的操作.
      • 分頁取回資料
      • 操作JDBC的參數
      • Array Property的操作
      • Collection Property的操作
      • 更複雜的Collection Property
      • 指定表格名稱
      • 新增資料庫Dialect
    • Eva_IOC >
      • IOC程式主體
      • AOP應用
    • Eva_Struct >
      • Struct範例
      • Bit Strcut範例
      • 指標範例
      • 於Eva_ORM中使用
    • Eva_Sort >
      • 依指定Properties排序
      • 部份排序
      • 優先排序部份
    • Eva_Cache >
      • hashing-based cache
      • 非hashing-based cache
  • API列表
  • 技術支援
    • 協助開發
  • 相關書籍

Trait.

我們實作類似於Scala Trait的功能, 在下面的範例中, 動態產生一個類別, 而類別的內容, 是由使用者所指定的類別去組合產生.

由於該功能尚未公開, 所以提供功能的類別名稱被混淆過了, 但仍可以被混淆過的類別去使用該功能, 僅管看起來奇怪, 但使用者在引用 Eva 的 library 後, 下方的範例會是可以正確執行的. 

在下方的範例中宣告了一個 A 介面, 而且實作它的抽象類別為, B, C, D 類別. 由 B, C, D 類別我們組合出了一個新類別 clz, 由測試結果可看出, clz 中 op 與 op2 的實際內容, 來自於前 3 個類別中同名函式的組合.

package com.logntw.eva.trait;

import junit.framework.Assert;

import org.junit.Test;

public class ComposerTest
{
  //com.logntw.eva.trait.Trait = com.logntw.eva.imp.ael 
  public static interface A extends com.logntw.eva.imp.ael<A>
  {
    public int op(int value);
    
    public int op2(int value);
  }
  
  public static abstract class B implements A
  {
    @Override
    public int op(int value)
    {
      return value + 9;
    }

    @Override
    public int op2(int value)
    {      
      return value + 13;
    }
  }
  
  public static abstract class C implements A
  {
    @Override
    public int op(int value)
    {
      return precedency().op(value % 7);
    }
  }
    
  public static abstract class D implements A
  {
    @Override
    public int op(int value)
    {
      return precedency().op(value * 2);
    }
    
    @Override
    public int op2(int value)
    {
      return precedency().op2(value * 3);
    }
  }  
  
  @Test
  public void testComposer() throws Exception
  {
    //com.logntw.eva.trait.Composer -> com.logntw.eva.imp.aek:
    //  java.lang.Class getInstance(java.lang.Class,java.lang.Class[]) -> b
    Class<? extends A> clz = com.logntw.eva.imp.aek.b(A.class, B.class, C.class, D.class);
    
    A a = clz.newInstance();
    
    Assert.assertEquals(a.op(5), (((5 * 2) % 7) + 9));
    
    Assert.assertEquals(a.op2(4), ((4 * 3) + 13));         
  }
}
Powered by Create your own unique website with customizable templates.