views:

13

answers:

2

Hi I have 20 strings each will have same package structure except class name.These string need to be passed to method as and when require. Refer the code below

public static final String RECENT_MSG_        = "com.foo.xxs.RecentMessage";
public static final String PROJ_              = "com.foo.xxs.Proj";
public static final String FORECAST           = "com.foo.xxs.Forecase";
public static final String REQUEST            = "com.foo.xxs.Request";
public static final String UNAPPROVED         = "com.foo.xxs.UnApproved";
public static final String UNPOSTED           = "com.foo.xxs.Unposeted";
public static final String VACANT             = "com.foo.xxs.Vacant";
public static final String ORG_VIOL           = "com.foo.xxs.OrgViolation";
public static final String ORG_WARN           = "com.foo.xxs.OrgWarning";
public static final String EMP_VIOL           = "com.foo.xxs.EmpViolation";
public static final String EMP_WARN           = "com.foo.xxs.EmpWarning";    
public static final String TS_WARN            = "com.foo.xxs.TSWarn";
public static final String TS_VIOL            = "com.foo.xxs.TSViolation";
public static final String AGE_GROUP          = "com.foo.xxs.AgeGroup";


private void rescheduleTasks(long _taskType,String value)
{
    if(_taskType == 1000 &&(_sSchedTaskMgr.getInstance().getCurrentScheduledTaskInfo(RECENT_MSG_)==null))
    {

    // do something     
    }

}

This can be done also as .

public static final String RECENT_MSG_        = "RecentMessage";
public static final String PACK                       ="com.foo.xxs."

and concat here

    if(_taskType == 1000 &&(_sSchedTaskMgr.getInstance().getCurrentScheduledTaskInfo(PACK+RECENT_MSG_)==null))

Which one would be better.

+2  A: 

They will have the same performance - the concatenation will be performed at compile time rather than execution time as both parts are constants. There will be fewer strings in the constant pool in the original version, admittedly - but that's unlikely to make a difference.

Which do you find more readable? I can't say there's much in it for me - I dislike the repetition of the first form, but equally I'm not sure I'd want to concatenate everywhere.

Another alternative is:

public static final String PACK               = "com.foo.xxs."
public static final String RECENT_MSG_        = PACK + "RecentMessage";

etc - so you perform the concatenation at the point of the constant declaration. Then you can just use RECENT_MSG_ in the code, as per the first snippet, but avoid the "com.foo.xxs" duplication as per the second.

EDIT: Another option you may want to consider is using an enum.

Jon Skeet
+1  A: 

I would go for the first version, you just make it easier for a reader to immediately see what the strings mean and what classes you're referring too. In addition, should you ever want to introduce a class from a different namespace, you'll be able to do so.

The second version, in contrast, introduces some logic which needs to be interpreted by a reader first.

If you go for the second version, use Jon's alternative instead, so that at least you still have the option to introduce classes from other namespaces.

chiccodoro
Thanks !! very good suggestion
GustlyWind