2010-02-17 2 views
1

Я хочу написать идентификатор клиента статического класса, который начинается с C1000, и для каждого созданного нового объекта клиента он добавит +1, C1001, C1002, C1003 , и так далее. Как это сделать, если есть строка?Как написать статический класс с идентификатором со строкой в ​​нем

public class Customer 
{ 
    private static int customerID = 1000; 

    public Customer() 
    { 
     customerID++; 
    } 

    public static int getcutomerID() 
    { 
     return customerID; 
    } 
} 

ответ

3
public class Customer { 
    private static int customerID = 1000; 

    // wth would you do this?! static state is evil! 
    public Customer() { customerID++; } 

    public String getCurrentCustomerID() { return "C" + customerID; } 
} 

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

public class Customer { 
    private final int id; 
    public Customer(final int id) { this.id = id; } 
    public int getId() { return id; } 
} 

public class CustomerDatabase { 
    private int nextId; 

    public CustomerDatabase() { this(0); } 
    public CustomerDatabase(int nextId) { this.nextId = nextId; } 

    public synchronized int nextId() { return nextId++; } 

    // define useful operations for a CustomerDatabase 
} 

// maybe you could use the database and customer classes as follows 
public class CustomerApplication { 
    public static void main(String[] args) { 
     // first argument is highest customer id 
     CustomerDatabase db = new CustomerDatabase(Integer.parseInt(args[0])); 

     Customer c = new Customer(db.nextId()); 
     db.add(c); 

     System.out.println(db.getCustomers()); 

     db.save("customers.txt"); 

     Customer x = db.findById(13); 
     if(x.isBroke()) db.delete(x); 

     System.out.println("K thx, bai"); 
    } 
} 
+0

Это кажется излишним, нет ли лучшего метода решения его проблемы? –

6
public class Customer { 
    private static int NextCustomerId = 1000; 
    private final int myCustomerId; 

    public Customer() { 
     myCustomerId = NextCustomerId++; 
     ... 
    } 

    public String getCustomerId() { 
     return "C" + myCustomerId; 
    } 
} 

Обратите внимание, что это, вероятно, не потокобезопасны. Если вам это нужно, посмотрите на java.util.concurrent.atomic.AtomicInteger и используйте один из них для NextCustomerId.

+2

nah ... ему лучше не использовать статическую переменную вообще ... он должен отделить заботу о выдаче новых идентификаторов клиентов из класса Customer - возможно, создать IdGenerator (или CustomerDatabase, как я включил в мой модифицированный ответ). Легко проверять, нет ли статического состояния. Как работает сериализация, если у вас есть статическое состояние? Ряд проблем возникает только с ... статическим состоянием ... – les2

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