日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java 计算协方差_Java的深度:通过协方差暴露的API泄漏

發布時間:2023/12/3 java 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 计算协方差_Java的深度:通过协方差暴露的API泄漏 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

java 計算協方差

Java有時可能非常棘手,特別是在API設計中。 讓我們看一個非常有趣的展示柜。 jOOQ強烈地將API與實現分開。 所有API都在org.jooq包中,并且是公共的。 大多數實現是在org.jooq.impl包和package-private中。 只有工廠和一些專用的基礎實現是公開的。 這允許非常強大的包級封裝,幾乎只向jOOQ用戶公開接口。

包級封裝的簡化示例

大致來說,jOOQ如何建模SQL表。 (過于簡化的)API:

package org.jooq;/*** A table in a database*/ public interface Table {/*** Join two tables*/Table join(Table table); }

還有兩個(過于簡化的)實現類:

package org.jooq.impl;import org.jooq.Table;/*** Base implementation*/ abstract class AbstractTable implements Table {@Overridepublic Table join(Table table) {return null;} }/*** Custom implementation, publicly exposed to client code*/ public class CustomTable extends AbstractTable { }

內部API的公開方式

假設內部API在協方差方面有一些技巧:

abstract class AbstractTable implements Table, InteralStuff {// Note, this method returns AbstractTable, as it might// prove to be convenient to expose some internal API// facts within the internal API itself@Overridepublic AbstractTable join(Table table) {return null;}/*** Some internal API method, also package private*/void doThings() {}void doMoreThings() {// Use the internal APIjoin(this).doThings();} }

乍一看,這看起來很安全,是嗎? AbstractTable是包私有的,但CustomTable對其進行了擴展并繼承了其所有API,包括“ AbstractTable join(Table)”的協變方法重寫。 這會導致什么? 查看以下客戶端代碼

package org.jooq.test;import org.jooq.Table; import org.jooq.impl.CustomTable;public class Test {public static void main(String[] args) {Table joined = new CustomTable();// This works, no knowledge of AbstractTable exposed to the compilerTable table1 = new CustomTable();Table join1 = table1.join(joined);// This works, even if join exposes AbstractTableCustomTable table2 = new CustomTable();Table join2 = table2.join(joined);// This doesn't work. The type AbstractTable is not visibleTable join3 = table2.join(joined).join(joined);// ^^^^^^^^^^^^^^^^^^^ This cannot be dereferenced// ... so hide these implementation details again// The API flaw can be circumvented with castingTable join4 = ((Table) table2.join(joined)).join(joined);} }

結論

篡改類層次結構中的可見性可能很危險。 注意以下事實:在接口中聲明的API方法始終是公共的,而不管涉及非公共偽像的任何協變實現。 如果API設計人員無法正確處理API用戶,這可能會很煩人。

在下一版的jOOQ中已修復

參考: Java的深度:在JAVA,SQL和JOOQ博客中, JCG合作伙伴 Lukas Eder 通過協方差暴露了API泄漏 。


翻譯自: https://www.javacodegeeks.com/2012/05/depths-of-java-api-leak-exposed-through.html

java 計算協方差

總結

以上是生活随笔為你收集整理的java 计算协方差_Java的深度:通过协方差暴露的API泄漏的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。