Şimdi Ara

Java'da neden ic ice fonksiyonlar (nested methods) yok ?

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
17
Cevap
0
Favori
815
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 1
Giriş
Mesaj
  • merhaba arkadaslar bircok programlama dilinde olmasina ragmen java da boyle birsey yok. java kotu ve populer olmayan bir programlama dili olsa birsey demeyecegim ama dunyaynin en iyi programlama dillerinden ve en cok kullanilan dillerden biri. durum boyle oluncada birsey diyemiyorum java'nin bir bildigi vardir diyorum ama o bildigini ben bilmiyorum. siz biliyorsaniz neden java da boyle birseyin olmadigini bana soylermisiniz. tesekkur ederim.

    ic ice fonksiyonlara izin veren programlama dilleri:
    C, C++, Python, .....



  • Java 8 ile beraber bu ozellik geldi ki Java 8 2014 ten beri var. Lutfen kaynaklari yenileyelim. Lambda neymis ogrenelim.

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • ThisisaNightmare T kullanıcısına yanıt
    hocam ben lambda fonksiyonlar olamaz demedimki. ona bakarsaniz pythonda da lambda fonksiyonlar var. ama ayriyyeten birde normal fonksiyonlari ic ice kullanmamiza olanak sagliyor iste neden javada bu ozellik yok.

    Edit:
    bu arada java yi ogreniyorum daha oralara gelmedim. merakimdan bu konuyu actim.



    < Bu mesaj bu kişi tarafından değiştirildi psikolojikSorunlu.insan -- 6 Kasım 2017; 20:18:40 >
    < Bu ileti mobil sürüm kullanılarak atıldı >
  • quote:

    Orijinalden alıntı: psikolojikSorunlu.insan

    hocam ben lambda fonksiyonlar olamaz demedimki. ona bakarsaniz pythonda da lambda fonksiyonlar var. ama ayriyyeten birde normal fonksiyonlari ic ice kullanmamiza olanak sagliyor iste neden javada bu ozellik yok.

    Edit:
    bu arada java yi ogreniyorum daha oralara gelmedim. merakimdan bu konuyu actim.

    Cok isteresen statik olarak yine deklare edebilirsin. Ama dedigim gibi lambda yi bir variable a assign edip sonradan cagirabildikten sonra bu statik olayi gereksiz geliyor.

    < Bu ileti mobil sürüm kullanılarak atıldı >
  • yoksa başka türlü yapılabildiği için yoktur . yıllardır java kullanıyorum, hiç eksikliğini hissetmedim.



    < Bu mesaj bu kişi tarafından değiştirildi funky-nd -- 7 Kasım 2017; 11:43:39 >
  • çünkü Java object-oriented. Her şey bir nesneye bağlı ve nesnenin de bir class'ı olmak zorunda, havada uçuşan metotlar/fonksiyonlar olamaz.

    lamba expression'da bile anonim bir nesne var, zaten yeni birşey değil sadece syntactic sugar.

    < Bu ileti mini sürüm kullanılarak atıldı >
  • funky-nd kullanıcısına yanıt
    seyfi84 S kullanıcısına yanıt
    @funky-nd
    eksikligini hisstemediyseniz icim rahatladi dogrusu :D cunki birden icim daraldi java da boyle bi ozellligin olmamasindan dolayi.


    @seyfi84
    hocam havada ucusan methodlar olamaz bu object-oriented bir dil demissiniz ama. C# da object oriented degilmi ? C++, Python da degilmi ? ozaman neden bunlarda boyle bir ozellik var java da yok ? yoksa java hepsinden dahami object-oriented, yada java dilinin bilmedigim ayri bir felsefesimi var. tesekkurler.
  • psikolojikSorunlu.insan P kullanıcısına yanıt
    Nested method derken rekürsif fonksiyonlardan bahsediyorsunuz, yanlış anlamadım değil mi?

    Java'da bu özelliğin olmadığını kim söylüyor? Gayet de var. Örnek:

     
    import java.lang.System;
    import java.lang.String;

    public class Main {
    public static void main(String[] args) {

    int[] array = {3,6,9,12,15,16,17,21,29,35,50};
    int number = 35;
    int result = binarySearch(array, number);
    System.out.println("Dizide " + number + " sayisi " + (result == -1 ? " bulunmamaktadir." : ( (result+1) + ". elemandir.")) );

    }

    public static int binarySearch(int[] array, int x) {
    return _binarySearchRecursive(array, 0, array.length-1, x);
    }
    public static int _binarySearchRecursive(int[] array, int l, int r, int x) {
    if(l > r) return -1; // not found
    int mid = (l+r)/2;
    if(x == array[mid]) return mid;
    if(x < array[mid]) return _binarySearchRecursive(array, l, mid-1, x);
    else return _binarySearchRecursive(array, mid+1, r, x);
    }
    }




  • Harun2525 H kullanıcısına yanıt
    Ha fonksiyon içinde fonksiyon tanımlamadan bahsediyorsun.

    Hayatımda hiç kullanma gereği duymadım ben de :D
  • psikolojikSorunlu.insan P kullanıcısına yanıt
    Java sadece object-oriented. Hello world yazmak icin bile class deyip baslarsin yazmaya. C++ ve python'da object-oriented mecburi degil, aradaki fark bu.

    Java'da bir global namespace de yok bu nedenle. Package ve class var (simdi bir de modul geldi Java9 ile).

    C#'ta da olmamasi lazim. Cunku metot diye bir veri türü yok.

    < Bu ileti mini sürüm kullanılarak atıldı >
  • Bir dilin mümkün olan her özelliği içinde bulundurması onu en iyi dil yapmıyor çünkü.

    Bir programlama dili seçerken ilk düşüneceğin şeylerden biri de dilin sana nasıl bir abstraction sunacağıdır. Java karşılaştığın problemi nesne yönelimli programlamayla modellemene olanak verir. Bu tarz soyutlamalar iç içe geçmiş fonksiyonlara ihtiyaç duymazlar. Haskell, Scala gibi fonksiyonel diller ise sana daha farklı bir soyutlama çözümü sunar, o yüzden higher-order function'lar, recursive nested function'lar filan yazarsın.

    C++14'de yok yalnız bu olay. Python'dakinin kullanıldığını bugüne kadar görmedim. C#'da da yok.
  • nested methodu ne yapacaksınız bir anlasam cevap verebileceğim ama. Zaten en temizi divide and conquer iken daha da birleştirip nested method yapmak bana mantıklı gelmedi. Algoritma olarak gerek duyduğunuz bir örneği söylerseniz biz de aydınlanırız :)
  • quote:

    Orijinalden alıntı: bowfinger

    nested methodu ne yapacaksınız bir anlasam cevap verebileceğim ama. Zaten en temizi divide and conquer iken daha da birleştirip nested method yapmak bana mantıklı gelmedi. Algoritma olarak gerek duyduğunuz bir örneği söylerseniz biz de aydınlanırız :)

    Nested fonksiyonlar divide and conquer gibi paradigmalara karşıtlık oluşturmazlar yalnız. Örneğin A* algoritması çalıştıran bir class'ımız olsun. Java, C++ gibi dillerde cost hesaplayan heuristic fonksiyon class içindeki her elemanın erişebileceği bir fonksiyon iken fonksiyonel dillerde sadece move fonksiyonunun erişebileceği bir yapı. Buradaki mantık divide and conquer değil zaten, doğru abstraction.

    Nested fonksiyonlar dil loop'ları desteklemiyorsa recursive işlem yapmak için de kullanılır. Scala'dan bir örnek:

    def fibonacci(n: Int): BigInt = { 
    def go(n: Int, num: BigInt): BigInt = if (n == 1) num else go(n - 1, num * n)

    go(n, 1)
    }




  • bowfinger B kullanıcısına yanıt
    Javascript'te lazım, çünkü o dilde class scope yok, namespace yok, package yok.. sadece function scope ve global scope var (block scope bile yeni eklendi). Function içinde function tanımlayıp sonra closure olarak export ederek ancak encapsulation sağlayabiliyorsun.

    Bir de şu use case için: diyelim bir fonksiyon yazdın, zamanla bu çok genişledi, parçalara bölmek istiyorsun, fakat ortaya çıkan parçaların o fonksiyon haricinde hiç kimseye faydası yok, yani gereksiz yere outer scope'u doldurmuş olacaksın, onun yerine fonksiyon içinde tanımlarsın ve dışardan hiçkimse erşemez, namespace'i pollute etmez. Bunun için de Java'da nested class/inner class olayı var zaten.

    < Bu ileti mini sürüm kullanılarak atıldı >
  • bowfinger B kullanıcısına yanıt
    hocam dedim ya merakimdan actim bu konuyu. ben gerek olup olmadigini bile blimiyorumki. bana cok normal geliyordu. ama gerek yokmus.

    bu arada herekese beni aydinlattigi icin tesekkurler.
  • seyfi84 S kullanıcısına yanıt
    hocam herseyi bir class icinde yapmak nasil olabilirki diyelimki yaptik class lara ne isim koycaz yani gruplandirma cok ayri bir dert.
  • 
Sayfa: 1
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.