Feed Rss



Авг 23 2009

Доступ к статическим методам в Java

рубрика: Java Автор:

Изучая структуры в 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(); // ...а вот это добавляет в код проблемы понимания, ИММХО

Вот такой вот вечерний обзор :)

Понравился пост? Подпишись на RSS!

Метки: , , ,

14 ответов на “Доступ к статическим методам в Java”

  1. besisland says:

    В PHP тоже можно при желании к статическому методу через экземпляр обратится.

  2. Алексей Токарь says:

    например?

  3. Surg420 says:

    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;

    зы. И всё же, как у вас в пыхпыхе?

  4. Алексей Токарь says:

    Проблема только в восприятии кода.
    Когда вызывать статические методы можно только как член класса, то их всегда хорошо видно в коде.
    В пыхе я чета не припомню что б можно было вызывать метод из экземпляра, но может бесайланд нас просветит…

  5. I am free says:

    Можно вызывать на объекте статические методы. Оно должно кинуть ворнинг, что-то типа "вызывается метод объекта, объявленный статическим".

    А чего ты хотел собственно? Джава совсем другой язык однако. Там многие вещи кажутся на первый взгляд притянутыми за уши — "зачем делать так, если можно сделать проще?!". То что ты называешь строкой — на самом деле объект класса String, и сравнивая blah == 'hit' по сути ты делаешь приведение объекта к строке и сравнение. Фигня в том что строка в джаве — массив байтов, он может быть разной длинны, кодировки и т.д. Поэтому и будет не всегда одинаковым. Для этого и есть .equals()

  6. Алексей Токарь says:

    2im_free: можно где? в РНР? можно пример?

    а насчет объекта String все намного сложнее нем Вы написали. Все строки в Java являются неизменяемыми и две одинаковых строки по сути ссылаются на один и тот же адрес в памяти. А оператор "==" тем и занимается что проверяет — к одному адресу памяти относятся операнды или нет.
    Так вот суть в том, что одинаковые строки не всегда относятся к одному участку памяти.

  7. Алексей Токарь says:

    да и я вообще ничего не хотел — просто констатирую факты :)

  8. BITCreator says:

    Петрович, это к чему? ;)
    Я про увлечению Явой…

  9. BITCreator says:

    To Be Or Not To Be – решать вам, как по мне – можно смириться с недостатками какого-то одного фреймворка, и наслаждаться его преимуществами.(с)Шевчук

  10. anonymous says:

    Если вы ожидаете увидеть надпись “hit”, то вы ее можете и не увидеть. Точнее у вас нет 100% гарантии что эти строки будут одинаковыми. Вот такой абсурд. Приходится применять метод .equals()

    семантика «==» для ссылочных типов данных, это проверка на равенство ссылок.
    константная строка тоже объяект :) проверте: «qwerty».length()
    также этим часто пользуются вот так:
    if(«qwert».equals(var)){}

    вместо
    if(var != null && var.equals(«qwerty»))

    чтоб сократить код и избежать NullPointerException

  11. anonymous says:

    по второму пункту
    в классе можно использовать свои(определенные в классе) статические методы и поля без указания класса. для доступа из других классов есть замечательная вещь «import static», например это даст вам возможность использовать в вашем классе мат функции:
    import static java.lang.Math.*;
    class ClassName{
    public static void main(String[] args) {
    System.out.println(sin(1.0));
    }
    }

    • Алексей Токарь says:

      можно, но речь во втором пункте шла немного о другом. Мне не нравится что у экземпляра класса можно вызывать статические методы класса

  12. фыва says:

    В пхп без разницы как писать:
    A::test();
    a->test();