2015-11-03 2 views
-4

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

public class ObjectHolderUtil { 
/** 
* Object of the main stage of the application 
*/ 
public static Stage mainStage; 
public static HibernateSession hibernateSession; 
public static String dashboard="/fxml/Dashboard.fxml"; //dashboard fxml file 
public static String mainScreen="/fxml/MainScreen.fxml"; 
public static String addBill="/fxml/AddBill.fxml"; 
public static StackPane mainStackPane; 
public static User user; 

public static Helper helper; 

    public static String getMainScreen() { 
    return mainScreen; 
    } 

    public static void setMainScreen(String mainScreen) { 
    ObjectHolderUtil.mainScreen = mainScreen; 
    } 

    public static Helper getHelper() { 
    return helper; 
    } 

    public static void setHelper(Helper helper) { 
    ObjectHolderUtil.helper = helper; 
    } 

    public static User getUser() { 
    return user; 
    } 

    public static void setUser(User user) { 
    ObjectHolderUtil.user = user; 
    } 

public static StackPane getMainStackPane() { 
    return mainStackPane; 
    } 

    public static void setMainStackPane(StackPane mainStackPane) { 
    ObjectHolderUtil.mainStackPane = mainStackPane; 

    } 

    public static Stage getMainStage() { 
    return mainStage; 
    } 

    public static void setMainStage(Stage mainStage) { 
    ObjectHolderUtil.mainStage = mainStage; 
    } 

    public static String getDashboard() { 
    return dashboard; 
    } 

    public static void setDashboard(String dashboard) { 
    ObjectHolderUtil.dashboard = dashboard; 
    } 

    public static HibernateSession getHibernateSession() { 
    return hibernateSession; 
    } 

    public static void setHibernateSession(HibernateSession hibernateSession) { 
    ObjectHolderUtil.hibernateSession = hibernateSession; 
    } 
} 

И я бы назвал объект этого класса, как ObjectHolderUtil.setMainStackPane(mainStackPane);

+1

Рассмотрите возможность использования одноплодной или нормальный класс с одним конкретизации вместо этого? – Bathsheba

+0

Не нужно, чтобы все было статичным. Может быть, класс должен быть Синглтон. Также не публикуйте переменные класса как общедоступные. Они должны быть частными. – Qwerky

+0

@Bathsheba - Если это всего лишь класс утилиты, то сделать собственный конструктор достаточно прав? – TheLostMind

ответ

1

Try, чтобы избежать каких-либо статические вещи, если это возможно. В OO мы склонны использовать Объекты для всего и делать статические вещи только в том случае, если они являются безусловными или имеют вескую причину.

Класс util используется, если у вас есть методы для решения простых задач, которые не относятся ни к одному классу (редко в случае). Не то, что вы хотите.

я удалил некоторые из ваших varriables и методов, чтобы сделать код shoter ...

Varriante 1 - Конструктор

Вы можете создать этот объект несколько раз и иметь несколько экземпляров. Но вы также можете создать только один - что приятно. Вид, как вы можете открыть окна проводника несколько раз

Обладатель информации

public class BillingServrice { 

    private Stage mainStage; 
    private StackPane mainStackPane; 
    private User user; 
    private HibernateSession hibernateSession; 

    public BillingServrice() { 
    // create all the other objects here 
    // pass this as parameter 
    mainStage = new Stage(this); 
    mainStackPane= new StackPane (this); 
    } 

    // ... all the getters and setters 
} 

объекта

public class Stage { 

    private BillingServrice billingServrice; 

    public Stage (BillingServrice billingServrice) { 
    this.billingServrice = billingServrice; 

    } 

    void doSomething() { 
    System.out.println(billingServrice.getUser()); 
    } 

} 

Varriante 2 - Singleton

Th ere будет только одним из них, нет никакого способа создать это несколько раз. Это может вызвать проблему в некоторых случаях, если вы не полностью понимаете этот шаблон.

Обладатель информации

public class BillingServrice { 

    private static BillingServrice billingServrice; 

    public static BillingServrice getInstance() { 

    if(billingServrice == null) billingServrice = new BillingServrice(); 
    return billingServrice; 

    } 

    private Stage mainStage; 
    private StackPane mainStackPane; 
    private User user; 
    private HibernateSession hibernateSession; 

    private BillingServrice() { 
    // You need to define the constuctor 
    } 


    // ... all the getters and setters 


} 

Объект

public class Stage { 

    private BillingServrice billingServrice; 

    public Stage() { 
    this.billingServrice = BillingServrice.getInstance(); 

    } 

    void doSomething() { 
    System.out.println(billingServrice.getUser()); 
    } 

} 
+0

Я обновил свой вопрос. Предложите мне, как закодировать это, не делая статических переменных и методов. К этому отдельному классу обращаются несколько классов в несколько раз Например: MainStageController.java может использовать getMainScreen(); в одном месте и setUser(); в другом месте LoginController.java может использовать getUser(); в одном месте и setMainStackPane в другом месте – oldvipera

+0

Хорошо, теперь, что я сделал, я удалил слово 'static' и подвел его к нормальному классу. Теперь, когда я хочу получить доступ к этому классу, я просто расширяю его и получаю доступ к его методам. Но теперь проблема заключается в том, что дочерний класс A обращается к одному объекту этого родительского класса, а дочерний класс B обращается к другому объекту родительского класса. Я хочу, чтобы к одному объекту класса родителя были доступны все дочерние классы. Как бы я это сделал – oldvipera

+0

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

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