2015-01-20 3 views
0

Это может показаться основным вопросом, но я хотел бы получить это право.Лучшая практика Java Access Modifier

У меня есть класс «AWorld». Внутри этого класса у меня есть метод, который рисует границу, в зависимости от размера карты, заданного пользователем.

Если переменная 'mapSize' является частной, но я хочу получить доступ к ее значению из одного класса, то более целесообразно ссылаться на нее напрямую или использовать метод getter.

Код, приведенный ниже, должен объяснить, что я хочу знать.

package javaFX; 

public class AWorld { 
    //initialized later 
    AWorld newWorld; 

    private int mapSize = 20; 

    public int getMapSize() 
    { 
     return mapSize; 
    } 

    public void someMethod() 
    { 
     int var = newWorld.mapSize; //Do I reference 'mapSize' using this... 
    } 
    // Or... 

    public void someOtherMethod() 
    { 
     int var = newWorld.getMapSize(); //Or this? 
    } 
    public static void main(String[] args) {} 

} 
+1

Я думаю, что большая проблема здесь заключается в том, почему класс AWM содержит экземпляр «AWorld»? Вы создали бесконечный цикл. Каждый раз, когда вы создаете «AWorld», конструкция создает новый «AWorld», и вы добираетесь до ума. –

+0

@JohnB это объясняется в тексте вопроса. Похож на обертку. Вероятно, его следует вводить, а не создавать внутри страны. –

+0

Не обращайте внимания на экземпляр newWorld, я бросил это вместе в качестве примера кода, чтобы задать вопрос, поскольку класс, который я использую, значительно длиннее. –

ответ

2

Любой из них в порядке, так как вы получаете примитивное поле. Если метод get выполняет другую операцию перед возвратом данных, например. выполняя математическую операцию над значением, тогда было бы лучше использовать ее, а не напрямую обращаться к полю. Это особенно важно при использовании шаблона proxy/decorator для ваших классов.

Вот пример второго утверждения сверху:

//base class to be decorated 
abstract class Foo { 
    private int x; 
    protected Foo foo; 
    public int getX() { return this.x; } 
    public void setX(int x) { this.x = x; } 
    public Foo getFoo() { return this.foo; } 

    //method to prove the difference between using getter and simple value 
    public final void printInternalX() { 
     if (foo != null) { 
      System.out.println(foo.x); 
      System.out.println(foo.getX()); 
     } 
    } 
} 

//specific class implementation to be decorated 
class Bar extends Foo { 
    @Override 
    public int getX() { 
     return super.getX() * 10; 
    } 
} 

//decorator 
class Baz extends Foo { 
    public Baz(Foo foo) { 
     this.foo = foo; 
    } 
} 

public class Main { 
    public static void main(String[] args) { 
     Foo foo1 = new Bar(); 
     foo1.setX(10); 
     Foo foo2 = new Bar(foo1); 
     //here you see the difference 
     foo2.printInternalX(); 
    } 
} 

Выход:

10 
100 
+0

do u означает newWorld.mapSize == mapSize? – Yazan

+0

@ Язан. Я никогда не думал об этом. –

+0

@LuiggiMendoza Я согласен с вами. Это поможет, если вы можете привести конкретный пример в своем ответе. – ultrajohn

0

Вам лучше разыменовать него непосредственно.

Точка частного модификатора не должна раскрывать внутреннюю реализацию другим классам. Эти другие классы будут использовать метод getter для получения значения частной собственности.

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

+0

Это почти верно, если вы или другая структура не используете классы прокси, а не ваши классы, например. Hibernate. В этом случае документы Hiberante рекомендуют использовать геттеры, а не прямые поля, поскольку они, возможно, еще не были извлечены из-за необходимости выполнять внутренний вызов базы данных, прежде чем заполнять значение поля. –

+0

@ LuiggiMendoza Я предположил, что getters/direct access делают то же самое. Если нет, нет смысла спрашивать, следует ли вам использовать тот или иной, вы должны использовать тот, который выполняет задание, которое вы хотите сделать. – mavroprovato

+0

И вот в чем мой ответ. –

0

IMHO, если вы ссылаетесь на поле текущего экземпляра, общим правилом является доступ к поле непосредственно с mapSize или this.mapSize.

Если вы ссылаетесь на значение из другого экземпляра (будь то того же класса или другого класса, я бы использовал метод getter). Я считаю, что это приведет к более простому рефакторингу. Он также поддерживает контракт, что любой другой экземпляр получает значение поля через геттер, что позволяет использовать дополнительные функции в геттере.

+0

Этот подход является проактивным. Ответ Луиджи реактивен. В этом случае мне нравится последний. – ultrajohn

Смежные вопросы