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

تفاوت های زبان برنامه نویسی جاوا با گرووی

زبان برنامه نویسی جاوا و گرووی

امروزه زبان برنامه نویسی جاوا و گرووی بسیار مورد استفاده قرار می گیرند. مشابه بودن بسیاری از مسائل میان این دو زبان برنامه نویسی یکی از مهم ترین دلایلی است که توسعه دهندگان جاوا را به Groovy نیز می کشاند ولی باید بدانید که دانستن اطلاعاتی در خصوص این زبان برنامه نویسی می تواند برای شما مفید واقع شود. در ادامه ما برای شما لیستی از تفاوت های میان این دو زبان برنامه نویسی را برای شما بیان خواهیم کرد که قطعا می تواند برای شما مفید واقع شود. با آی تی پورت همراه باشید.

اجاز دهید قبل از پرداختن به تفاوت های زبان برنامه نویسی جاوا و گرووی ابتدا به دو سوال زبان برنامه‌نویسی گرووی چیست؟ و زبان برنامه‌نویسی جاوا چیست؟ بپردازیم.

زبان برنامه‌نویسی گرووی (Groovy) یک زبان برنامه‌نویسی دینامیک و شیءگرا است که ابتدا در دهه ۲۰۰۰ میلادی توسعه یافته است. این زبان از سینتکسی مشابه با جاوا استفاده می‌کند و امکاناتی را از زبان‌های دیگر مانند پایتون و روبی به ارث برده است. Groovy بر روی ماشین مجازی جاوا (JVM) اجرا می‌شود و از جاوا کلاس‌ها و کتابخانه‌ها به صورت مستقیم بهره می‌برد. این زبان محبوبیت زیادی در جهان توسعه نرم‌افزار به دلیل ساختار خوانا، کد کوتاه و قابلیت‌های برنامه‌نویسی پویا به دست آورده است. Groovy به عنوان یک زبان اسکریپتی، برنامه‌نویسی شیءگرا، و از توانمندی‌های زبان‌های توسعه‌یافته‌تر نیز بهره‌مند است.

در طرف مقابل زبان برنامه‌نویسی جاوا (Java) یک زبان برنامه‌نویسی شیءگرا، مستقل از سکو، و تحت مدیریت شرکت Sun Microsystems (اکنون در وابستگی شرکت اوراکل) توسعه یافته است. جاوا یکی از زبان‌های برنامه‌نویسی پراستفاده در صنعت نرم‌افزار است و برخورداری از ویژگی‌هایی چون قابلیت همراهی (portability)، امنیت، قابلیت چندنخی (concurrency)، و همچنین کدزنی مقیاس‌پذیر را ارائه می‌دهد. یکی از ویژگی‌های برجسته جاوا استفاده از ماشین مجازی جاوا (JVM) است که به کاربران این امکان را می‌دهد تا کد جاوا را بر روی هر سکوی سخت‌افزاری که JVM را پشتیبانی می‌کند، اجرا کنند. جاوا به عنوان یک زبان سراسری برای توسعه برنامه‌های متنوع از اپلیکیشن‌های موبایل گرفته تا نرم‌افزارهای وب و سرورها به کار می‌رود.

تفاوت زبان برنامه نویسی جاوا و گرووی از لحاظ انتقال داده های پیش فرض

در زبان برنامه نویسی جاوا و گرووی، تمامی بسته ها و کلاس های زیر به صورت پیش فرض انجام می شود و برای استفاده از این داده ها نیازی به استفاده از مقداری نیست:

  • Java.io
  • Java.lang
  • Java.math.BigDecimal
  • Java.math.Biglnteger
  • Java.net
  • Java.util
  • Groovy.lang
  • Groovy.util

تفاوت زبان برنامه نویسی جاوا و گرووی از لحاظ متدهای چندگانه

در زبان برنامه نویسی Groovy، روش هایی فراخوانی می شوند که در زمان اجرا انتخاب می گردند و به این روش اعزام در زمان اجرا یا چند روش برای اجرا گفته می شود. این مسئله به معنای آن است که روش فراخوانی بر اساس استدلال ها در زمان اجرا انتخاب می گردند. این مسئله در حالی است که در جاوا مسئله برعکس می شود و روش ها در زمان کامپایل بر اساس انواع اجرا اعلام می گردند.

کد زیر را در نظر بگیرید که با زبان برنامه نویسی جاوا نوشته شده است، این کد در زبان برنامه نویسی جاوا و گرووی قابلیت اجرا دارد ولی رفتار متفاوتی را از خود نشان می دهد.

int method(String arg) {
    return 1;
}
int method(Object arg) {
    return 2;
}
Object o = "Object";
int result = method(o);

در جاوا ما خواهیم داشت :

assertEquals(2, result);

ولی در گرووی از کد زیر استفاده می کنیم :

assertEquals(1, result);

این مسئله به این دلیل است که در جاوا از نوع اطلاعات ساکن استفاده می شود، یعنی o به عنوان object شناخته می شود و این در حالی است که این مسئله در حالت اجرا انتخاب می شود. زمانی که متد فراخوانی می شود. زمانی که از واژه String استفاده شود، مقدار دهی برابر با String خواهد بود.

تفاوت جاوا و گرووی از لحاظ مقادی اولیه آرایه ها

در جاوا مقادیر اولیه ای که برای آرایه ها در نظر گرفته می شود، به دو شکل زیر خواهد بود :

int[] array = {1, 2, 3};             // Java array initializer shorthand syntax
int[] array2 = new int[] {4, 5, 6};  // Java array initializer long syntax

در زبان برنامه نویسی Groovy ما بلوک {…) را به عنوان بسته شدن در نظر می گیریم. این مسئله به معنای آن است که ما نمی توانیم با استفاده از نحو مختصر نویسی جاوا، آرایه را با حروف کوچک نیز بنویسیم. در عوض ما می توانیم نماد های گرووی را مورد استفاده قرار دهیم که شامل موارد زیر می شود.

int[] array = [1, 2, 3]
 

در زبان برنامه نویسی گرووی نسخه سه و بالاتر ما می توانیم از آرایه های جاوا در منطق طولانی استفاده داشته باشیم :

def array2 = new int[] {1, 2, 3} // Groovy 3.0+ supports the Java-style array initialization long syntax
 

تفاوت زبان برنامه نویسی جاوا و گرووی از لحاظ Package و محدوده آن ها

در زبان برنامه نویسی گرووی ما نمی توانیم از حذف یک قسمت از یک فیلد آن را به عنوان بسته خصوصی معرفی کنیم. تکه کد زیر را در نظر داشته باشید :

class Person {
    String name
}
 

در عوض می توانیم از این قابلیت برای ایجاد ویژگی های جدید استفاده کنیم. به معنای آن که می توانیم یک فیلد خصوصی ایجاد کنیم که مرتبط به تنظیم کننده های مربوط به خود می باشد.

به تکه کد زیر دقت داشته باشید :

class Person {
    @PackageScope String name
}
 

در این کد از قابلیت @PackageScope استفاده شده است.

تفاوت زبان برنامه نویسی جاوا و گرووی از لحاظ بلوک های ARM

 در نسخه شماره ۷ جاوا، بلوک های ARM برای مدیریت خودکار منابع مانند مثال زیر معرفی می شوند :

Path file = Paths.get("/path/to/file");
Charset charset = Charset.forName("UTF-8");
try (BufferedReader reader = Files.newBufferedReader(file, charset)) {
    String line;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }

} catch (IOException e) {
    e.printStackTrace();
}
 

این بلوک ها از زبان برنامه نویسی جاوا و گرووی نسخه سه به بالاتر پشتیبانی می شوند و با این حال می توان گفت که Groovy با وجود روش های مختلف می تواند بست های بیشتری را به ما ارائه دهد که برای ما می تواند مفید واقع شود.

new File('/path/to/file').eachLine('UTF-8') {
   println it
}
 

همچنین در صورتی که می خواهید در گرووی نزدیک تر به جاوا برنامه نویسی کنید می توانید از تکه کد زیر استفاده داشته باشید :

new File('/path/to/file').withReader('UTF-8') { reader ->
   reader.eachLine {
       println it
   }
}
 

تفاوت زبان برنامه نویسی جاوا و گرووی از لحاظ کلاس های داخلی

  • هشدار : اجرای کلاس های داخلی و کلاس های تو در تو به صورت ناشناس می تواند تفاوت هایی را داشته باشد. برای مثال متغیر های محلی که از این کلاس ها قابل دسترسی هستند، می تواند نهایی باشد. ما برخی از جزئیات پیاده سازی را که برای groovy.lang مورد استفاده است را به شما معرفی خواهیم کرد.

کلاس های داخلی ثابت

در ادامه مثالی از کلاس داخلی ثابت را برای شما بیان می کنیم :

class A {
    static class B {}
}

new A.B()
 

استفاده از کلاس های داخلی ثابت می تواند بهترین پشتیبانی مورد استفاده باشد. در صورتی که کاملا به یک کلاس داخلی احتیاج پیدا کنید، می توانید آن را به عنوان کلاس ثابت در نظر بگیرید.

کلاس های داخلی ناشناس

import java.util.concurrent.CountDownLatch
import java.util.concurrent.TimeUnit

CountDownLatch called = new CountDownLatch(1)

Timer timer = new Timer()
timer.schedule(new TimerTask() {
    void run() {
        called.countDown()
    }
}, ۰)

assert called.await(10, TimeUnit.SECONDS)
 

ایجاد نمونه هایی از کلاس های داخلی غیر ثابت

در زبان برنامه نویسی جاوا می توانید از این نمونه استفاده کنید :

public class Y {
    public class X {}
    public X foo() {
        return new X();
    }
    public static X createX(Y y) {
        return y.new X();
    }
}
 

تا پیش از نسخه شماره ۳٫۰٫۰ زبان برنامه نویسی گرووی، این زبان از y.new X() پشتیبانی نمی کرد. به جای آن شما باید از دستور new X(y) استفاده می کردید. به کد زیر دقت کنید :

public class Y {
    public class X {}
    public X foo() {
        return new X()
    }
    public static X createX(Y y) {
        return new X(y)
    }
}
 
  • هشدار : روش های فراخوانی در زبان برنامه نویسی گرووی یک پارامتر بدون ارائه استدلال به صورت پشتیبانی می باشد و سپس پارامتر مقدار null خواهد داشت. در صورتی که قوانین برای تماس دو کلاس اعمال شود، این مشکل ممکن است پیش بیاید که به جای new X() نیاز به استفاده از new X(this) را داشته باشید. پس از نسخه شماره سه گرووی این مشکل برطرف شد.

تفاوت جاوا و گرووی از لحاظ عملگرها

در نسخه ۸ جاوا از عبارات lambda و عملکرد مرجع روش پشتیبانی می شود ( :: ) :

Runnable run = () -> System.out.println("Run");  // Java
list.forEach(System.out::println);
 

در گرووی ۳ و بالاتر نیز از این موارد در تجزیه و تحلیل از Parrot پشتیبانی می کند. در نسخه های قبلی در گرووی به جای این که از تکه کد بالا استفاده کنید، برای بسته ها باید از کد زیر استفاده می کردید :

Runnable run = { println 'run' }
list.each { println it } // or list.each(this.&println)
 

تفاوت زبان برنامه نویسی جاوا و گرووی از لحاظ GStrings

از آن جا که اصطلاحات رشته ای دو نقل شده به عنوان مقادی GStrings شناخته می شوند، در صورتی که برای یک کلاس با String literal که دارای کاراکتر دلار است، کامپایلر ممکن است خطای شکست ایجاد کند و این مسئله در دو زبان برنامه نویسی جاوا و گرووی ممکن است روی دهد.

در حالی که به طور معمول می توان گفت در صورتی که API به ما نوع پارامتر را اعلام کند، در زبان برنامه نویسی گرووی بین GStrings و String به طور خودکار بازیابی انجام می شود. در صورتی که API های مربوط به جاوا که پارامتر Object را می پذیرند، باید به طور قطع بررسی شوند.

 

تفاوت جاوا و گرووی از لحاظ بیان عمومی رشته و کاراکتر

در زبان برنامه نویسی گرووی برای بیان String باید از سینگل کوتیشن (‘’) استفاده شود ولی برای بیان نتیجه در String باید از دبل کوتیشن (“”) استفاده شود.

assert 'c'.getClass()==String
assert "c".getClass()==String
assert "c${1}".getClass() in GString
 

زبان برنامه نویسی گرووی به صورت خودکار سینگل کاراکتر استرینگ را به char تبدیل می کند و نتایج را به صورت String یا GString تبدیل می کند :

char a='a'
assert Character.digit(a, 16)==10 : 'But Groovy does boxing'
assert Character.digit((char) 'a', 16)==10

try {
  assert Character.digit('a', 16)==10
  assert false: 'Need explicit cast'
} catch(MissingMethodException e) {
}
 

گرووی از دو روش برای تغییر به Char پشتیبانی می کند که این دو روش یکی از آن ها multi-char strings نام دارد که در صورت بروز خطا در روش C-style cast مورد استفاده قرار می گیرد.

// for single char strings, both are the same
assert ((char) "c").class==Character
assert ("c" as char).class==Character

// for multi char strings they are not
try {
  ((char) 'cx') == 'c'
  assert false: 'will fail - not castable'
} catch(GroovyCastException e) {
}
assert ('cx' as char) == 'c'
assert 'cx'.asType(char) == 'c'
 

تفاوت جاوا و گرووی از لحاظ Primitives و wrappers

به این دلیل که زبان برنامه نویسی گرووی از همه کد ها از autowraps استفاده می کند و به primitives اشاره دارد، رفتاری مشابه با جاوا از خود نشان نمی دهد. در ادامه مثالی از استفاده int را برای شما بیان خواهیم کرد :

int i
m(i)

void m(long l) {           
  println "in m(long)"
}

void m(Integer i) {        
  println "in m(Integer)"
}
 

نکات :

  1. متد اول: این روشی است که جاوا فراخوانی می کند چرا که گسترش نسبت به استفاده از کد ها اولویت دارد.
  2. متد دوم: این روشی است که گرووی نیز استفاده می کند چرا که تمامی منابع اولیه از کلاس خود تبعیت می کنند.

تفاوت زبان برنامه نویسی جاوا و گرووی از لحاظ رفتار ==

در زبان برنامه نویسی جاوا == به معنای برابری انواع هویت و اشیا شناخته می شود و این در حالی است که در زبان برنامه نویسی گرووی == به معنای برابری در تمامی موارد می باشد. در زبان برنامه نویسی گرووی این نوشتار به a.compareTo(b) == 0 ترجمه می شود. در زمان ارزیابی برابری برای Comparable مفاهیم و a.equals(b) در جهت دیگر. برای چک کردن نوع مقدار می توانیم از is در متد a.is(b) استفاده کنیم. از نسخه سه گرووی به بعد نیز می توانید از === به این منظور استفاده کنید. برای مثال : a === b

تفاوت زبان برنامه نویسی جاوا و گرووی از لحاظ تبدیل ها

جاوا به صورت خودکار تبدیل ها را انجام می دهد و آن ها را محدود می کند.

جدول یک : تبدیل های جاوا

Converts from

boolean

byte

short

char

int

long

float

double

boolean

N

N

N

N

N

N

N

byte

N

Y

C

Y

Y

Y

Y

short

N

C

C

Y

Y

Y

Y

char

N

C

C

Y

Y

Y

Y

int

N

C

C

C

Y

T

Y

long

N

C

C

C

C

T

T

float

N

C

C

C

C

C

Y

double

N

C

C

C

C

C

C

  • Y نشان دهنده تبدیل هایی است که جاوا می تواند انجام دهد، C نشان دهنده تبدیل است که جاوا می تواند در صورت وجود یک عنصر دیگر انجام دهد، T نشان دهنده تبدیل هایی است که جاوا می تواند انجام دهد ولی داده ها کوچک می شوند. N نشان دهنده تبدیل جاوا می باشد.

جدول دو : تبدیل های گرووی

Groovy Conversions

  • Y نشان دهنده تبدیل هایی است که گرووی می تواند انجام دهد، D نشان دهنده تبدیل است که گرووی می تواند در زمان کامپایل انجام دهد. T نشان دهنده تبدیل هایی است که گرووی می تواند انجام دهد ولی داده ها کوتاه می شود، B نشان دهنده یک عمل مربوط به باز کردن جعبه می باشد. N نشان دهنده تبدیل هایی است که گرووی نمی تواند انجام دهد.

در کوتاه کردن هنگام تبدیل Groovy Truth استفاده می گرددBoolean / booleam تبدیل از اعداد به کاراکتر ها انجام می شود و همچنین Number.intvalue() به char انجام می شود. گرووی می تواند به شما کمک کند تا بتوانید از آن ها استفاده داشته باشید. BigInteger و BigDecimal از Number.doubleValue() زمانی که تبدیل از Float به Double انجام می شود. در سمت دیگر این مسئله می تواند به عنوان toString شناخته می شود و شما می تواند برای شما مفید واقع شود. این مسائل با java.lang.Number استفاده می شود.

 

تفاوت جاوا و گرووی از لحاظ کلمات اضافه

گرووی دارای کلمات کلیدی بسیار زیادی است که به جاوا تشابه دارد و همچنین نوع رزرو آن ها مانند جاوا می باشد. همچنین در زبان برنامه نویسی گرووی می توانیم کلمات زیر را به صورت انحصاری داشته باشیم :

  • As
  • Def
  • In
  • Trait
  • It

زبان برنامه نویسی گرووی از لحاظ گستردگی، کمتر از جاوا می باشد و این مسئله اجازه می دهد تا بتوانید کلمات کلیدی را در برخی از مکان هایی که جاوا اجازه نمی دهند مورد استفاده قرار دهید. با این وجود شما می توانید بدون سردرگمی از این زبان برنامه نویسی استفاده کنید. در این مقاله آی تی پورت شما را با تفاوت های زبان برنامه نویسی جاوا و گرووی آشنا کردیم و اطلاعاتی را در این خصوص با شما به اشتراک گذاشتیم که قطعا می تواند برای شما مفید واقع شود.

گفتگو ها