有沒有更好的Marker方法?

自Java 1.5推出以來,就是否在Java中使用Marker接口進行了廣泛的討論和辯論。 這是因為Java 1.5引入了注釋功能,這些功能幾乎可以解決Marker接口的目的。 本文將涵蓋這場辯論的一個有趣的部分。
定義:
Java中的標記接口是一個空接口,沒有任何方法,字段或常量。 有時也稱為標記接口。


那么為什么使用Marker接口呢?

有效的問題! 它沒有解決與定義實現該接口的類的協定的接口的目的。 這些接口定義了沒有實現的方法,因為它們告訴子類需要做什么,但是由子類決定如何實現此方法。 但是,在Marker接口的情況下,沒有成員。

標記接口是一種聲明有關類的元數據的方法。 它告訴JVM,需要以不同的方式對實現標記器接口的類的對象進行特殊處理。 Java API中定義了一些現成的Marker接口:
java.io.Serializable
java.lang.Cloneable java.util.RandomAccess java.util.EventListener 我們還可以像創建其他接口一樣創建自己的標記接口版本。

讓我們更深入地了解Cloneable接口。 當需要在Java中克隆對象時,我們使用Object的clone()方法。 但是請注意,此方法不是Cloneable接口的一部分,即,當您的類默認實現Cloneable接口時,將不會像其他任何標準接口一樣實現clone方法。 當我們顯式定義它或調用對象的clone方法時,就可以完成此操作。
因此,不可能僅憑借對象實現此接口的事實來克隆對象。 即使克隆方法是反射式調用的,也不能保證它會成功。

public Object clone() {Object clone = null;try {clone = super.clone();} catch (CloneNotSupportedException e) {e.printStackTrace();}return clone;
}

這里的一個關鍵點是,當您嘗試使用clone()方法克隆對象時,除非實現Cloneable接口,否則將獲得CloneNotSupportedException 。 JVM非常聰明–是嗎?

注意事項:

如前所述,除了使用內置的標記接口之外,我們還可以創建特定于應用程序的標記接口,因為這是標記和邏輯分類代碼的一種好方法。 這在嘗試創建框架或開發API時主要有用。

有趣的一點:

Runnable不是Marker接口。 盡管run是對JVM啟動方法的特殊指令,但是Runnable不是標記接口,因為Runnable內部具有公共的void run()方法。

標記界面存在問題:

標記接口的主要問題是接口定義了用于實現類的協定,并且該協定被所有子類繼承。 這意味著您不能取消實施標記。 如果創建不想序列化的子類(可能是因為它依賴于瞬時狀態),則必須訴諸顯式拋出NotSerializableException .

現在讓我們回到重點。 使用注釋比標記界面更好嗎?

為了回答這個問題,讓我們更詳細地研究Java注釋。

定義:
Java注釋是Java 1.5中引入的語法元數據(關于數據的數據)的特殊形式。 像Java類一樣,接口甚至注釋都可以在多個Java元素上使用。

標記界面與標記注釋

與Javadocs不同,Annotations具有更多功能,可幫助在運行時進行處理。 注釋用于程序包或類聲明,方法聲明,字段聲明和變量聲明中。 它減少了編碼工作,讓開發人員可以輕松開發,專注于業務邏輯,從而提高了自動化程度。

注釋與標準Java元素之間用“ @”符號分隔。 每當編譯器遇到帶有任何Java元素的這些注釋時,它都會從注釋中提取信息并自動生成代碼。

注釋的用途:

  • 將信息傳遞給編譯器–用于檢測錯誤或抑制警告。 例如@ SuppressWarnings,@不建議使用
  • 編譯時間和部署時間處理–幾種工具可以處理注釋信息以生成代碼XML文件等。諸如Spring,Hibernate之類的框架大量使用注釋。
  • 運行時處理–僅在運行時處理這些批注。

以標記接口的類似方式,我們也有標記注釋。 標記注釋沒有任何方法或元素。 該行為與Marker接口相同。

例如, @ Override是內置的Java Marker批注類型,可以將其實現為方法,以指示編譯器編譯器該方法將覆蓋超類中的方法。 它不包含任何其他程序元素。 如果您在不覆蓋超類方法的方法上使用此批注,則編譯器將發出編譯錯誤,以提醒您該事實。 這種注釋類型可以防止程序員在重寫方法時犯錯誤,因為開發人員很可能實際上會在超類中重載方法而不是重寫。

似乎批注比標記界面更好,因為批注可以達到相同的效果。

  • 它可以標記變量,方法和/或類。
  • 它可以專門標記任何類,也可以通過繼承標記。 標記接口將標記已標記類的所有子類。 例如,如果我們必須將一個類標記為不可序列化,則必須專門將其標記為瞬態。 這可能是值得商bat的,因為注釋不是不可子類化的,可能是優點還是缺點。 注釋默認情況下不會繼承– isAnnotationPresent()會告訴您該特定類上是否存在該注釋,而不是它是否存在于超類或超接口上。 因此,如果您作為批注旨在提供的特殊功能的實現者,希望批注的行為像繼承一樣,則不僅要檢查此類 ,還要檢查每個超類和每個超接口的isAnnotationPresent()
  • 您可以將數據添加到標記中。 換句話說,非空白的注釋具有價值,因為您所標記的不僅僅是類型。

因此,他們每個人都有一定的優點和缺點,我個人認為應該由開發人員來決定是否使用標記界面或標記注釋,因為他們必須決定考慮實際情況并判斷優點和缺點。他們兩個,并確定最適合該要求的。

參考: 是否有更好的Marker方法? 從我們的JCG合作伙伴 Mainak Goswami在Idiotechie博客上獲得。

標記 2012-10-30

邁納克·高斯瓦米(Mainak Goswami)

翻譯自: https://www.javacodegeeks.com/2012/10/is-there-a-better-approach-to-marker.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371072.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371072.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371072.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

php jquery ajax登錄,jQuery+Ajax+PHP彈出層異步登錄效果(附源碼下載)

彈出層主要用于展示豐富的頁面信息,還有一個更好的應用是彈出表單層豐富交互應用。常見的應用有彈出登錄表單層,用戶提交登錄信息,后臺驗證登錄成功后,彈出層消失,主頁面局部刷新用戶信息。本文我們將給大家介紹如何使…

【CPU】解決打開360或者Chrome瀏覽器CPU占用過高

cmd 運行: RD /s /q "%USERPROFILE%\AppData\Roaming\Microsoft\Protect"轉載于:https://www.cnblogs.com/zwqh/p/6708398.html

# 20155337 2017-2018-1 《信息安全系統設計基礎》第二周課堂實踐+myod

20155337 2017-2018-1 《信息安全系統設計基礎》第二周課堂實踐myod 因為在課上已經提交了四個實驗,還欠缺最后一個實驗,反省一下自己還是操作不熟練,平時在課下應該多多練習linux的命令訓練。 實踐一 每個* .c一個文件,每個*.h一…

css盒模型中margin很牛逼

css盒子模型,說簡單也簡單,用的時候也有不簡單的。 其中margin的值可以為負值,并且為了實現margin,忽略父級的padding、border、甚至定位。這在布局上很有用,要注意。 ------------ 比如,div1&#xff0…

CometD:Java Web應用程序的Facebook類似聊天

聊天就像吃一塊蛋糕或喝一杯熱咖啡一樣容易。 您是否曾經考慮過自己開發聊天程序? 您知道,聊天不容易。 但是,如果您是開發人員,并且閱讀了本文的結尾,則可以嘗試自己開發一個聊天應用程序,并允許您的用戶通…

怎么用PHP建立購物網站,如何使用PHP建設一個購物網站

本系統以PHP為主要制作工具,實現了用戶注冊、登錄、驗證身份及用戶數據的采集、物品的預覽查詢、搜索/查看物品信息,站內最新物品信息發布,可進入在線下單從而實現了網絡銷售。網上購物,這個逐漸流行于二十世紀的購物方式已經為越…

團隊作業2——需求分析原型設計

需求分析: 軟件的最終目的是用來解決用戶的某些問題,需求分析就是要理解要解決的問題,真正明確用戶需求。請發表一篇隨筆,完成初步的需求分析: 1.訪問軟件項目的真實用戶(至少10個),…

給div命名,使邏輯更加清晰

我們把一些標簽放進<div>里&#xff0c;劃分出一個獨立的邏輯部分。為了使邏輯更加清晰&#xff0c;我們可以為這一個獨立的邏輯部分設置一個名稱&#xff0c;用id屬性來為<div>提供唯一的名稱&#xff0c;這個就像我們每個人都有一個身份證號&#xff0c;這個身份…

css邊框顏色漸變

在實際開發中&#xff0c;我們經常遇見邊框需要背景漸變的實現要求&#xff0c;那么如何去實現呢&#xff0c;今天給大家分享依稀幾種情況 1.直角的背景漸變 <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><meta…

ActiveMQ:了解內存使用情況

正如最近的一些郵件列表電子郵件和從Google返回的許多信息所表明的那樣&#xff0c;ActiveMQ的SystemUsage尤其是MemoryUsage功能使一些人感到困惑。 我將嘗試解釋有關MemoryUsage的一些細節&#xff0c;這些細節可能有助于理解它的工作方式。 我將不介紹StoreUsage和TempUsage…

php設置排序,7種php基本排序實現方法

本文總結了一下常用的7種排序方法&#xff0c;并用php語言實現。1、直接插入排序/** 直接插入排序,插入排序的思想是&#xff1a;當前插入位置之前的元素有序&#xff0c;* 若插入當前位置的元素比有序元素最后一個元素大&#xff0c;則什么也不做&#xff0c;* 否則在有序序列…

170406、用uid分庫,uname(用戶名)上的查詢怎么辦

【緣起】 用戶中心是幾乎每一個公司必備的基礎服務&#xff0c;用戶注冊、登錄、信息查詢與修改都離不開用戶中心。 當數據量越來越大時&#xff0c;需要多用戶中心進行水平切分。最常見的水平切分方式&#xff0c;按照uid取模分庫&#xff1a; 通過uid取模&#xff0c;將數據分…

bzoj2144: 跳跳棋(二分/倍增)

思維好題&#xff01; 可以發現如果中間的點要跳到兩邊有兩種情況&#xff0c;兩邊的點要跳到中間最多只有一種情況。 我們用一個節點表示一種狀態&#xff0c;那么兩邊跳到中間的狀態就是當前點的父親&#xff0c;中間的點跳到兩邊的狀態就是這個點的兩個兒子&#xff0c;從而…

電腦投屏軟件哪個好_目前當貝市場中投屏軟件哪個好,最全面投屏技巧盤點

現在不管是在家里還是公司里&#xff0c;為了看一些是視頻和資料&#xff0c;投屏到電視上是一件非常必要的事情&#xff0c;但是現在投屏的技巧各種各樣&#xff0c;投屏的軟件也是五花八門&#xff0c;小編平常也是經常投屏&#xff0c;也試過非常多的方法&#xff0c;這邊分…

從零開始的全棧工程師——html篇1.2

起名方式與CSS 一.起名方式(起名方式也叫選擇器) 起名的目的是為了給標簽添加屬性 常見的3種選擇器有 標簽選擇器 id選擇器(使用的時候加#) class選擇器(使用的時候加.) 樣式的要求是由選擇器的權重來決定的 標簽的權重為1 class的權重是10 id的權重是100 權重是可…

android開發中用到的px、dp、sp

先介紹一下這幾個單位&#xff1a;px : pixels(像素),相應屏幕上的實際像素點。dip :device independent pixels&#xff0c;與密度無關的像素&#xff0c;基于屏幕密度的抽象單位。在每英寸160點的顯示器上。 1dp 1px &#xff0c;即1 &#xff1a;1關系。&#xff08;dp 就是…

Spring:設置日志依賴項

這篇文章描述了如何在Spring中設置日志依賴。 它基于Dave Syer的帖子中提供的信息 。 這里提供有關Java日志記錄框架的提醒。 該代碼示例可在GitHub的Spring-Logging-Dependencies目錄中找到。 Spring使用Jakarta Commons Logging API&#xff08;JCL&#xff09;。 不幸的是&…

【Codeforces Round #424 (Div. 2) C】Jury Marks

【Link】:http://codeforces.com/contest/831/problem/C 【Description】 有一個人參加一個比賽; 他一開始有一個初始分數x; 有k個評委要依次對這個人評分; 依照時間順序依次給出這k個人的評分(可能為負數,負數的時候,表示分數會降低,而如果為正,則分數增加); 然后有一個…

php copy 文件夾,php刪除與復制文件夾及其文件夾下所有文件的實現代碼

/*復制xCopy函數用法&#xff1a;* xCopy("feiy","feiy2",1):拷貝feiy下的文件到 feiy2,包括子目錄* xCopy("feiy","feiy2",0):拷貝feiy下的文件到 feiy2,不包括子目錄*參數說明&#xff1a;* $source:源目錄名* $destina…

安卓app開發工具_怎么開發app軟件需要多少錢?主流app開發工具盤點

現在智能手機的快速普及讓手機app在生活中越來越重要&#xff0c;很多企業及創業者也意識到了app的重要性&#xff0c;但是怎么開發app軟件&#xff1f;有哪些主流app開發工具呢&#xff1f;這里就為大家分享一下如何快速開發app軟件。一、編程app開發工具主要針對專業的程序員…