Изучая структуры в Java, сделал для себя два не очень приятных открытия:
1) следующий код ведет себя не так как ожидается:
String var = "hello"; if( var == "hello" ) { System.out.println( "hit" ); }
Если вы ожидаете увидеть надпись «hit», то вы ее можете и не увидеть. Точнее у вас нет 100% гарантии что эти строки будут одинаковыми. Вот такой абсурд. Приходится применять метод .equals()
2) не очень мне нравится идея доступа к статическим методам классов из экземпляров этих классов:
class A { public static void test() {} } A.test(); // это я еще понимаю A a = new A(); a.test(); // ...а вот это добавляет в код проблемы понимания, ИММХО
Вот такой вот вечерний обзор :)
В PHP тоже можно при желании к статическому методу через экземпляр обратится.
например?
2) тема не раскрыта. В чём проблема? ;)
Ну а в рамках того, что около проблемное что-то таки есть, решил посмотреть как у других зубров дела обстоят.
С++: вызов возможен, но не допустит неразберихи. О легкочитаемости синтаксиса сей говорить абсурдно, но всё же…
class CTest
{
public: static void getVoid(){return ;};
};
int _tmain(int argc, _TCHAR* argv[])
{
CTest vTest;
vTest.getVoid();
CTest::getVoid();
return 0;
}
C#: забавно, но мелкомягкие у автора в единомышлениках. Member cannot be accessed with an instance reference.
public class CTest
{
public static void getVoid() { return; }
}
void testCall(object sender, EventArgs e)
{
CTest.getVoid();
CTest vTest = new CTest();
vTest.getVoid(); // Member cannot be accessed with an instance reference
}
Object Pascal: собственно за него и грустно:
TTest = class
private class procedure GetVoid;
end;
procedure CallSome;
var
vTest: TTest;
begin
TTest.GetVoid;
vTest := TTest;
try
vTest.GetVoid;
finally
vTest.Free;
end;
end;
зы. И всё же, как у вас в пыхпыхе?
Проблема только в восприятии кода.
Когда вызывать статические методы можно только как член класса, то их всегда хорошо видно в коде.
В пыхе я чета не припомню что б можно было вызывать метод из экземпляра, но может бесайланд нас просветит…
Можно вызывать на объекте статические методы. Оно должно кинуть ворнинг, что-то типа "вызывается метод объекта, объявленный статическим".
А чего ты хотел собственно? Джава совсем другой язык однако. Там многие вещи кажутся на первый взгляд притянутыми за уши — "зачем делать так, если можно сделать проще?!". То что ты называешь строкой — на самом деле объект класса String, и сравнивая blah == 'hit' по сути ты делаешь приведение объекта к строке и сравнение. Фигня в том что строка в джаве — массив байтов, он может быть разной длинны, кодировки и т.д. Поэтому и будет не всегда одинаковым. Для этого и есть .equals()
2im_free: можно где? в РНР? можно пример?
а насчет объекта String все намного сложнее нем Вы написали. Все строки в Java являются неизменяемыми и две одинаковых строки по сути ссылаются на один и тот же адрес в памяти. А оператор "==" тем и занимается что проверяет — к одному адресу памяти относятся операнды или нет.
Так вот суть в том, что одинаковые строки не всегда относятся к одному участку памяти.
да и я вообще ничего не хотел — просто констатирую факты :)
Петрович, это к чему? ;)
Я про увлечению Явой…
To Be Or Not To Be – решать вам, как по мне – можно смириться с недостатками какого-то одного фреймворка, и наслаждаться его преимуществами.(с)Шевчук
Если вы ожидаете увидеть надпись “hit”, то вы ее можете и не увидеть. Точнее у вас нет 100% гарантии что эти строки будут одинаковыми. Вот такой абсурд. Приходится применять метод .equals()
семантика «==» для ссылочных типов данных, это проверка на равенство ссылок.
константная строка тоже объяект :) проверте: «qwerty».length()
также этим часто пользуются вот так:
if(«qwert».equals(var)){}
вместо
if(var != null && var.equals(«qwerty»))
чтоб сократить код и избежать NullPointerException
да да — об этом я и написал немного ранее
по второму пункту
в классе можно использовать свои(определенные в классе) статические методы и поля без указания класса. для доступа из других классов есть замечательная вещь «import static», например это даст вам возможность использовать в вашем классе мат функции:
import static java.lang.Math.*;
class ClassName{
public static void main(String[] args) {
System.out.println(sin(1.0));
}
}
можно, но речь во втором пункте шла немного о другом. Мне не нравится что у экземпляра класса можно вызывать статические методы класса
В пхп без разницы как писать:
A::test();
a->test();