آشنایی با Groovy برای برنامهنویسان جاوا

این مطلب را جناب آقای امید نژادعباسی برای جاواکاپ ارسال کردهاند.
مقدمه
Groovy یک زبان سازگار با سینتکس جاوا است که برای ماشین مجازی جاوا توسعه داده شده است. نوع داده در این زبان هم استاتیک و هم داینامیک است. Groovy برخی ویژگیها را نیز از زبانهای Python و Ruby به ارث برده.
Groovy همچنین یک زبان اسکریپتنویسی با سینتکس قدرتمند و آسان (نسبت به اسکالا) به حساب می آید. از قابلیتهای مهم آن تبدیل شدن به DSL (Domain Specific Language) و برنامهنویسی متا است. از Groovy برای نوشتن اسکریپتهای ساخت (build) در ابزار Gradle نیز استفاده میشود.
Groovy در سال 2007 معرفی شد. بین رتبهبندیهای معتبر زبانها، بهترین رتبهاش، رتبه یازدهم در سایت TIOBE در سال 2019 بود.
در این مقاله به طور مختصر به معرفی ویژگیهای Groovy میپردازیم.
1 – سادگی
Groovy روی کتابخانه استاندارد جاوا ساخته شده و کدهای بسیار زیادی به آن اضافه کرده است. این کدها برنامهنویسی را بسیار سادهتر میکنند.
1.1 – خواندن فایل
به عنوان مثال، برای سادهتر کردن برنامهنویسی در Groovy، خواندن یک فایل به طور خطبهخط، به سادگی کد زیر است:
new File ("note.txt").eachLine("ASCI") { println it }
1.2 – تعریف کردن ArrayList و Map
همانطور که گفتیم نوع داده در Groovy میتواند داینامیک هم باشد. میتوانید از کلمه کلیدی def
برای تعریف متغیر استفاده کنید:
def list=[] def map=[:] assert list instanceof ArrayList&&map instanceof LinkedHashMap
حالا به راحتی میتوان روی عناصر این دادهها عملیات انجام داد:
list.each {element -> println element } map.each {entry -> println "User: $entry.user | Email: $entry.email" }
کتابخانه استاندارد Groovy پر است از این توابع که کدنویسی را خیلی کوتاهتر میکنند.
2 – درونیابی در رشتهها (String Interpolation)
در Groovy کاراکتر $
برای جانگهدارها استفاده میشود. اگر قصد فراخوانی متدی را داشته باشید باید از براکت هم استفاده کنید:
try{ throw new Exception() }catch(Exception e){ println "Error during operation. Cause: ${e.getMessage()}" }
یک امکان جالب دیگر Lazy Evaluation است:
def number=1 def str="number = ${ -> number}" assert str == "number = 1" number =2 assert str== "number = 2"
عبارت ${ -> number}
یک Closure است که با هر بار استفاده ار رشته str فراخوانی میشود. در کد بالا وقتی مقدار number تغییر میکند مقدار str هم تغییر می کند.
3- تبدیل نوع (Casting)
تبدیل نوع در Groovy خیلی پیشرفتهتر از جاوا انجام میشود. کلمه کلیدی as
برای تبدیل نوعها استفاده میشود. همچنین میتوانید متد asType()
را در کلاس خود پیادهسازی کنید تا بتوانید انواعی را که هیچ رابطهٔ سلسلهمراتبیای با هم ندارند را به هم تبدیل کنید:
enum Employee { MIKE, HANNA } String name="MIKE" assert (name as Employee) == Employee.MIKE
در کد بالا یک رشته را مستقیما به Employee
تبدیل کردیم که در جاوا امکانپذیر نیست.
4- کلمه کلیدی assert
assert
در Groovy کاربردی همانند جاوا دارد ولی بسیار قدرتمندتر است و اطلاعات بیشتری در اختیار ما قرار میدهد.
def contacts = ['John', 'Anna'] assert contacts.isEmpty()
و خروجی:
Exception in thread "main" Assertion failed: assert contacts.isEmpty() | | | false ['John', 'Anna']
5– الگوریتمهای Hash
اگر تا حالا سعی کرده باشید با جاوا از الگوریتمهای هش استفاده کنید حتما میدانید این کار اصلا سرراست و راحت نیست مگر اینکه از کتابخانههای خارجی استفاده کنید.
ولی Groovy با متدهایی که به کلاس String
اضافه کرده این کار بسیار آسان کرده است:
def password = "thisIsMyPassword" def md5 = password.md5() def sha256 = password.sha256() //برای الگوریتم های دیگر از متد زیر استفاده کنید def sha1 = password.digest('SHA-2')
6- عملگرها
Groovy تقریبا تمام عملگرهای زبانهای دیگر را پشتیبانی میکند ولی علاوه بر آنها عملگرهای دیگری نیز دارد:
6.1- عملگر Safe Navigation
از این عملگر برای اطمینان از null
نبودن متغیر استفاده میشود:
def user = person?.name // user == null
اگر شی person
خالی باشد NullPointerException
پرتاب نمیشود و در عوض شی user
خالی خواهد بود.
6.2- عملگر Spread
این عملگر (.*
) برای انجام عملی خاص بر روی همه اعضای یک ظرف از اشیا به کار میرود. برای مثال کد زیر را ببینید:
def people = [ new Person(name: 'John', age: '25'), new Person(name: 'Anna', age: '21') ] def friends = people*.name assert friends==['John', 'Anna']
people*.name
یعنی فیلد name را از تمامی اشیا Person در این لیست بگیر و آنها را در یک لیست بگذار. جالب است توجه کنید که اگر میخواستیم این کار را با کد جاوا بنویسیم چقدر طولانیتر میشد.
6.3- عملگرهای کار با regex
Groovy کار با regexها را بسیار آسان کرده است و سه عملگر برای این کار دارد:
~
: وقتی این عملگر در مقابل رشتهای قرار میگیرد از آن یک شی java.util.regex.Pattern
میسازد:
def pat = ~'abc{2}\\d' assert pat instanceof java.util.regex.Pattern
توجه داشته باشید که بین علامت مساوی و ~
یک فاصله بگذارید وگرنه به عنوان عملگر بعدی شناخته میشود
=~
: از این عملگر برای ساختن Matcher برای یک رشته از روی یک Pattern استفاده میشود:
def matcher= ('abcc5' =~ pat) assert matcher.find()
==~
: با این عملگر، اگر رشتهٔ مورد نظر با الگوی سمت راست عملگر همخوانی داشتهباشد، مقدار true
برمیگرداند:
def found = ("abcc5" ==~ pat) \\true
7- کلاسها و برنامهنویسی متا
برنامهنویسی متا به جادوی زمان کامپایل مشهور است. با این امکان شما میتوانید به کلاس مورد نظر ویژگیهای جدیدی اضافه کنید. برای مثال در کد زیر به کلاس String متدی اضافه میکنیم که تمام کاراکترهای فاصله را حذف کند و مقدار جدید برگرداند:
String.metaClass{ noSpace() { delegate.replaceAll("\\s+","") } } String str=" a b c " assert str.noSpace()=="abc"
البته بحث متاکلاسها بسیار مفصل است و ما اینجا آن را باز نمیکنیم. اگر میخواهید در این مورد بیشتر بدانید به این لینک مراجعه کنید.
جمعبندی
معمولا وقتی زبان برنامهنویسی جدید به میدان میآید، باعث پایین آمدن محبوبیت دیگر زبانها میشود. دقیقا همان کاری که Kotlin با Groovy کرد. انتخاب Kotlin توسط گوگل به عنوان زبان اصلی برای توسعه برنامههای اندروید باعث اصلی این اتفاق بود ولی با این حال Groovy هنوز پر استفاده و محبوب است. شاید مهمترین دلیلش این باشد که سینتکس Groovy خیلی به جاوا نزدیک است و همچنین شما برای استفاده از ابزار Gradle باید Groovy بلد باشید.
منبع: تجربیات شخصی نویسنده (اقای امید نژادعباسی) و این مطلب.
.
.
.
با ما همراه باشید
کانال تلگرام: JavaCupIR@
اکانت توییتر: JavaCupIR@
صفحه اینستاگرام: javacup.ir
صفحه ویرگول: javcup
گروه لینکدین: Iranian Java Developers
چندروز پیش که داشتم برای ابزار جنکینز یک shared-lib مینوشتم، با سینتکس این زبون آشنا شدم
سادگیش برام جالب بود
بهنظرم یکی از مشکلاتش اینه که community قوی به اندازه جاوا و کاتلین نداره