ABAP,Java和JavaScript的local class
Local class in ABAP
Suppose I have a global class with a public method ADD with following signature. I would like to implement with a local class inside this global class.
The local class could be created by clicking button “Local Definitions/Implementions”:
Now in my global class I can just delegate the ADD implementation to the local class. Notice that even ADD method is marked as public, it is still displayed as a red light in class builder, which makes sense since this ADD method in local class is not visible to outside consumers.
Local class in ABAP in widely used in the following scenarios:
(1) ABAP unit test class (2) The pre/post exit enhancement of class method are technically implemented via a local class in enhancement include. For example, once you click the “Post-Exit” button below,
You will see the source code as below, the local class LCL_ZCL_JERRY_POSTEXIT is automatically generated by class builder.
CLASS LCL_ZCL_JERRY_POSTEXIT DEFINITION DEFERRED.
CLASS CL_JERRY_TOOL DEFINITION LOCAL FRIENDS LCL_ZCL_JERRY_POSTEXIT.
CLASS LCL_ZCL_JERRY_POSTEXIT DEFINITION.
PUBLIC SECTION.
CLASS-DATA OBJ TYPE REF TO LCL_ZCL_JERRY_POSTEXIT. "#EC NEEDED
DATA CORE_OBJECT TYPE REF TO CL_JERRY_TOOL . "#EC NEEDED
INTERFACES IPO_ZCL_JERRY_POSTEXIT.
METHODS:
CONSTRUCTOR IMPORTING CORE_OBJECT
TYPE REF TO CL_JERRY_TOOL OPTIONAL.
ENDCLASS.
CLASS LCL_ZCL_JERRY_POSTEXIT IMPLEMENTATION.
METHOD CONSTRUCTOR.
ME->CORE_OBJECT = CORE_OBJECT.
ENDMETHOD.
METHOD IPO_ZCL_JERRY_POSTEXIT~GET_QUERY_RESULT.
*"------------------------------------------------------------------------*
*" Declaration of POST-method, do not insert any comments here please!
*"
*"class-methods GET_QUERY_RESULT
*" importing
*" !IV_COL_WRAPPER type ref to CL_BSP_WD_COLLECTION_WRAPPER
*" changing
*" value(RV_RESULT) type ref to IF_BOL_ENTITY_COL . "#EC CI_VALPAR
*"------------------------------------------------------------------------*
************** define your own post enhancement here!!! **************
ENDMETHOD.
ENDCLASS.
(3) if an event handler in a given program is not intended to be reused by other programs, it could be defined as a local class within the program it is used – in this case it is not necessary to define a global class as event handler.
There are lots of such examples in ALV examples delivered by SAP, see program BCALV_GRID_DND_TREE as example.
Inner Class in Java
The above example could simply be written in Java as well. In this example the inner class lcl_local does not follow Camel naming convention since I would like to highlight that it works exactly the same as the one in ABAP example.
public class LocalClassTest{
public int add(int var1, int var2){
return new lcl_local().add(var1, var2);
}
private class lcl_local {
public int add(int var1, int var2){
return var1 + var2;
}
}
}
Just exactly the same as in ABAP, the local class could not be used outside the class where it is defined.
One typical usecase of inner class in Java is the efficient implementation of a thread-safe singleton pattern, see sample code below:
public class Example {
private static class StaticHolder {
static final MySingleton INSTANCE = new MySingleton();
}
public static MySingleton getSingleton() {
return StaticHolder.INSTANCE;
}
}
“Local class” in JavaScript
I use double quote in title since the function object in JavaScript are not actual “class” concept in ABAP and Java.
Below source code is a simulation of private attributes & methods in JavaScript:
function createClass(conf){
function _injectAttribute(fn){
var prototype = fn.prototype;
for(var publicName in publics){
if(!publics.hasOwnProperty(publicName))
continue;
if(typeof publics[publicName]=="function")
prototype[publicName] = function(publicName){
return function(){
return publics[publicName].apply(privates, arguments);
}
}(publicName);
else
prototype[publicName] = publics[publicName];
if(!privates[publicName])
privates[publicName] = prototype[publicName];
}
return fn;
}
var publics, privates;
publics = conf.publics;
privates = conf.privates || new Object();
var fn = function(fn){
return function(){
return fn.apply(privates, arguments);
};
}(conf.constructor || new Function());
return _injectAttribute(fn);
}
var MyClass = createClass({
constructor:function(){
console.log("constructor is called: " + this.message);
},
publics:{
message:"Hello, World",
sayJavaScript:function(){
return this._message;
},
sayABAP:function(msg){
return msg + ", " + this.ABAP();
}
},
privates:{
_message: "Hello, JavaScript",
ABAP :function(){
return "ABAP";
}
}
});
var myClassInstance = new MyClass();
console.log(myClassInstance.message);
console.log(myClassInstance.sayJavaScript());
console.log(myClassInstance.sayABAP("Hello"));
console.log(myClassInstance._message);
console.log(myClassInstance.ABAP());
Testing shows it works as expected:
Local function in ES6
In ES6 it is possible to define a class via syntax suger class:
class Developer {
constructor(name, language) {
this.workingLanguage = language;
let _name = name;
let _getName = function() {
return _name;
};
this.getName = _getName;
}
}
var Jerry = new Developer("Jerry", "Java");
var Ji = new Developer("Ji", "JavaScript");
console.log("Developer name: " + Jerry.getName());
console.log("Jerry's working language: " + Jerry.workingLanguage);
console.log("local function accessible? " + Jerry._getName);
console.log("Jerry's name: " + Jerry._name);
Further reading
I have written a series of blogs which compare the language feature among ABAP, JavaScript and Java. You can find a list of them below:
- Lazy Loading, Singleton and Bridge design pattern in JavaScript and in ABAP
- Functional programming – Simulate Curry in ABAP
- Functional Programming – Try Reduce in JavaScript and in ABAP
- Simulate Mockito in ABAP
- A simulation of Java Spring dependency injection annotation @Inject in ABAP
- Singleton bypass – ABAP and Java
- Weak reference in ABAP and Java
- Fibonacci Sequence in ES5, ES6 and ABAP
- Java byte code and ABAP Load
- How to write a correct program rejected by compiler: Exception handling in Java and in ABAP
- An small example to learn Garbage collection in Java and in ABAP
- String Template in ABAP, ES6, Angular and React
- Try to access static private attribute via ABAP RTTI and Java Reflection
- Local class in ABAP, Java and JavaScript
- Integer in ABAP, Java and JavaScript
- Covariance in Java and simulation in ABAP
- Various Proxy Design Pattern implementation variants in Java and ABAP
- Tag(Marker) Interface in ABAP and Java
- Bitwise operation ( OR, AND, XOR ) on ABAP Integer
- ABAP ICF handler and Java Servlet
- [机器学习]-[数据预处理]-中心化 缩放 KNN(二)
- [数据清洗]-看上去一样的数字
- [数据清洗]- Pandas 清洗“脏”数据(三)
- [数据清洗]- Pandas 清洗“脏”数据(二)
- [数据清洗]-Pandas 清洗“脏”数据(一)
- [数据清洗]-混乱的邮编数据
- 10行代码,Python实现爬取淘宝/天猫评论
- 4.请求安全-- 结合使用的安全优势总结
- TensorFlow强化学习入门(4)——深度Q网络(DQN)及其扩展
- 3.请求安全-- 如何验证请求的唯一性
- 2.请求安全-- MD5的必要性以及实际应用场景
- 1.请求安全-- 一个简单的 单设备登录 单点登录
- phalapi-进阶篇3(自动加载和拦截器)
- phalapi-进阶篇2(DI依赖注入和单例模式)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python3 requests模块如何模仿浏览器及代理
- PHP中的empty、isset、isnull的区别与使用实例
- Laravel学习笔记之Artisan命令生成自定义模板的方法
- php微信扫码支付 php公众号支付
- PHP析构函数destruct与垃圾回收机制的讲解
- 关于php unset对json_encode的影响详解
- python实现二分类和多分类的ROC曲线教程
- PHP随机数函数rand()与mt_rand()的讲解
- PHP实现小程序批量通知推送
- Keras loss函数剖析
- Laravel使用scout集成elasticsearch做全文搜索的实现方法
- python3.4中清屏的处理方法
- TensorFlow Autodiff自动微分详解
- python interpolate插值实例
- pandas.DataFrame.drop_duplicates 用法介绍