2016-04-28 6 views
-1

У меня есть класс с этим, это пример кода, а не реальный кодJava: Возможная статическая переменная, возможно?

private static String className; 

public static Wish getInstance(Class<?> clazz) { 
    if(wish == null) 
     wish = new Wish(); 

    className = clazz.getName(); 
    return wish; 
} 

Многие классы используют этот Wish класс, то каждый класс должен «сказать» желание с className прошел в методе getInstance.

Тогда у меня есть что-то вроде этого

public class Boy { 
    private Wish w = Wish.getInstance(Boy.class); 
    //at this moment the static variable take "com.package.Boy" value 
.... 
} 

Другой classs

public class Girl { 
    private Wish w = Wish.getInstance(Girl.class); 
    //at this moment the static variable take "com.package.Girl" value 
.... 
} 

Когда все начинают говорить свои пожелания, пример

public class WishesDay { 
    private Girl g; 
    private Boy b; 

    public void makeYourWish() { 
     g = new Girl(); //get the com.package.Girl value 
     b = new Boy(); //get the com.package.Boy value 

     //sample output "com.package.Boy wants A pink house!" 
     g.iWish("A pink house!"); // the boys don't want this things :(
     b.iWish("A spatial boat!"); 
    } 
} 

Я знаю, что каждый объект имеет тот же копировать o класс Wish и статическую переменную className изменить, когда каждый объект (Girl, Boy) вызывает метод Wish.getInstance(Class<?> clazz).

Как использовать статическую переменную (я хочу избежать создания экземпляра класса Wish) и сохранить правильное значение для переменной className.

Могу ли я сделать это со статической переменной? или решение заключается в создании экземпляра (без статической переменной)

Например, log4j имеет класс Logger, я хочу сделать то же самое с именем класса.

+0

В Java нет статических классов. Я не совсем уверен, что вы просите, но я думаю, что вы хотите использовать одноэлементный шаблон. https://en.wikipedia.org/wiki/Singleton_pattern –

+0

Как выглядит метод iWish? – AdamSkywalker

+0

Просто делает вывод 'System.out.println (w.className +" хочет "+ strWish);' –

ответ

1

Вам нужно будет сделать свой конструктор закрытым, если вы хотите избежать создания экземпляра класса Wish и сделать className не статическим.

public class Wish { 

    String className; 


    private Wish(String className){ 
     this.className = className; 
    } 

    public static Wish getInstance(Class<?> clazz) { 
     String className = clazz.getName(); 
     return new Wish(className); 
    }  
    public String getClassName() { 

     return className; 
    } 

} 



package com.test; 
public class WishesDay { 
    private Girl g; 
    private Boy b; 

    public void makeYourWish() { 
     g = new Girl(); //get the com.package.Girl value 
     b = new Boy(); //get the com.package.Boy value 

     //sample output "com.package.Boy wants A pink house!" 
     g.iWish("A pink house!"); // the boys don't want this things :(
     b.iWish("A spatial boat!"); 
    } 
    public static void main(String[] args) { 
     WishesDay wd = new WishesDay(); 


     wd.makeYourWish(); 
     //outputs com.test.Girl wants A pink house! 
     //com.test.Boy wants A spatial boat! 


    } 

} 
+0

Пожалуйста, см. этот https://github.com/ropherpanama/implementations/blob/master/issues/question_1. Я думаю, что пример лучше, я попробую ваш ответ. Благодаря! –

+0

@RosendoRopher Я видел эту ссылку, и у них такая же проблема, как и вы, и я проверял реализацию нескольких loggers org.slf4j, например, и они сохраняют имя класса нестатическим, как и я. – raven

+0

Да, но косвенно (с помощью getInstance) это создает новый экземпляр объекта. Это правильный способ, может ли это отрицательно повлиять? Многие многие классы будут называть этот «пишущий» процесс.Положительным является то, что теперь сохраняйте правильное значение :) –

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