Arama butonu
Bu konudaki kullanıcılar: 1 misafir
15
Cevap
876
Tıklama
0
Öne Çıkarma
Java'da neden ic ice fonksiyonlar (nested methods) yok ?
P
8 yıl
Teğmen
Konu Sahibi

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, .....

DH forumlarında vakit geçirmekten keyif alıyor gibisin ancak giriş yapmadığını görüyoruz.

Üye olduğunda özel mesaj gönderebilir, beğendiğin konuları favorilerine ekleyip takibe alabilir ve daha önce gezdiğin konulara hızlıca erişebilirsin.

Üye Ol Şimdi Değil



T
8 yıl
Yarbay

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ı >
Bu mesaja 1 cevap geldi.
P
8 yıl
Teğmen
Konu Sahibi

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ı >
Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @ThisisaNightmare
T
8 yıl
Yarbay

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ı >

F
8 yıl
Yarbay

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 >
Bu mesaja 1 cevap geldi.
S
8 yıl
Yüzbaşı

çü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ı >

P
8 yıl
Teğmen
Konu Sahibi

@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.


Bu mesaja 2 cevap geldi.

Bu mesajda bahsedilenler: @funky-nd @seyfi84
G
8 yıl
Teğmen

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);
}
}




Bu mesajda bahsedilenler: @psikolojikSorunlu.insan
G
8 yıl
Teğmen

Ha fonksiyon içinde fonksiyon tanımlamadan bahsediyorsun.

Hayatımda hiç kullanma gereği duymadım ben de :D




Bu mesajda bahsedilenler: @Harun2525
S
8 yıl
Yüzbaşı

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ı >


Bu mesajda bahsedilenler: @psikolojikSorunlu.insan
O
8 yıl
Çavuş

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.



B
8 yıl
Teğmen

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 :)


Bu mesaja 3 cevap geldi.
O
8 yıl
Çavuş

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)
}



S
8 yıl
Yüzbaşı

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ı >
Bu mesaja 1 cevap geldi.

Bu mesajda bahsedilenler: @bowfinger
P
8 yıl
Teğmen
Konu Sahibi

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.




Bu mesajda bahsedilenler: @bowfinger
P
8 yıl
Teğmen
Konu Sahibi

hocam herseyi bir class icinde yapmak nasil olabilirki diyelimki yaptik class lara ne isim koycaz yani gruplandirma cok ayri bir dert.




Bu mesajda bahsedilenler: @seyfi84
DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.