I'm Working in A new Project and I already coded config.java for my project
My config.java code
package com.egf.myapp;
public class Config {
public static final String APP_API_URL = "http://www.egypt-freelancers.me/en/index.php";
public static final String APP_IMAGES_URL = "http://www.egypt-freelancers.me/uploads/";
public static final String APP_IMAGES_THUMB_URL = "http://www.egypt-freelancers.me/uploads/thumbnail/";
public static final String LANGUAGE_EN = "en";
public static final String LANGUAGE_AR = "fr";
public static final String DEFAULT_LANGUAGE = LANGUAGE_EN;
how to replace APP_API_URL with
custom language string.xml value
For English
http://www.egypt-freelancers.me/en/index.php
For French
http://www.egypt-freelancers.me/fr/index.php
Thanks
As per my understandings on the question you gave,
To get those variable values you can use this.
Config.STRING_VARIABLE_NAME; // this will return you the value from that class and object creation for that class is not needed as the variable is static.
Example :
String myvalue = Config.APP_API_URL;
Related
Constant names should be match with this regular expression '^[A-Z][A-Z0-9](_[A-Z0-9]+)$' But I have DateConstant and I think date formats of constants more understandable and readable, if use write them like this:
public static final String DATE_FORMAT_yyyyMMdd = "yyyyMMdd";
public static final String DATE_FORMAT_yyyy_MM_dd = "yyyy-MM-dd";
public static final String DATE_FORMAT_yyyy_MM_dd_Combined = "yyyyMMddHHmm";
public static final String DATE_FORMAT_yyyy_MM_dd_HH_mm = "yyyy-MM-dd HH:mm";
public static final String DATE_FORMAT_dd_MM_yyyy = "dd-MM-yyyy";
public static final String DATE_FORMAT_dd_MM_yyyy_WITH_DOT = "dd.MM.yyyy";
public static final String DATE_FORMAT_mm_dd_yyyy_WITH_SLASH = "MM/dd/yyyy";
public static final String DATE_FORMAT_m_d_yyyy_WITH_SLASH = "M/d/yyyy";
public static final String DATE_FORMAT_dd_mm_yyyy_WITH_SLASH = "dd/MM/yyyy";
public static final String DATE_FORMAT_dd_MMM = "ddMMM";
public static final String DATE_FORMAT_dd_MM_yy = "ddMMyy";
public static final String DATE_FORMAT_dd_MMM_yyyy = "ddMMMyyyy";
public static final String DATE_FORMAT_dd_MM_yyyy_COMBINED = "ddMMyyyy";
public static final String DATE_FORMAT_dd_MM_yyyy_HH_mm_ss = "yyyy-MM-dd'T'HH:mm:ss";
public static final String DATE_FORMAT_dd_MM_yyyy_HH_mm_ss_sz = "yyyy-MM-dd'T'HH:mm:ss.SSS";
public static final String DATE_FORMAT_dd_MM_yyyy_HH_mm_ss_sz_XXX = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX"; // with mobile client
public static final String DATE_FORMAT_dd_MM_yyyy_HH_mm = "dd-MM-yyyy HH:mm";
public static final String DATE_FORMAT_HH_mm = "HH:mm";
public static final String DATE_FORMAT_YYYY_MM_DDTHH_mm_ssZ = "YYYY-MM-DD'T'HH:mm:ssZ"; // Google Calendar Format
I need some advice and find alternative way to rename these constant names.
I completely agree with #luk2302, including the value of a constant in its name is a bad idea.
However, given your current situation why not just define Map that is static and final. It is almost equivalent to all your constants defined and you wouldn't get any warnings from your IDE or tools like sonar.
In this solution we create 2 maps. The first map contains all the constant values but is defined as private. If this is declared public then its values can be altered and defeats the purpose of a constant. To overcome this issue we define an unmodifiable map which is declared in the last line of the static block. Now by exposing only this map no mutation on it is possible.
Try :
public class Constant {
private Constant() { } // Can't create obj of this class
// map that contains the constans but not exposed
private static final Map<String, String> mapOfConstants = new HashMap<String, String>();
// unmodifiable map that is exposed
public static Map<String, String> unmodifiableMap;
static {
mapOfConstants.put("yyyyMMdd", "yyyyMMdd");
mapOfConstants.put("yyyy_MM_dd", "yyyy-MM-dd");
mapOfConstants.put("yyyy_MM_dd_Combined", "yyyyMMddHHmm");
mapOfConstants.put("yyyy_MM_dd_HH_mm", "yyyy-MM-dd HH:mm");
mapOfConstants.put("dd_MM_yyyy", "dd-MM-yyyy");
mapOfConstants.put("dd_MM_yyyy_WITH_DOT", "dd.MM.yyyy");
mapOfConstants.put("mm_dd_yyyy_WITH_SLASH", "MM/dd/yyyy");
mapOfConstants.put("m_d_yyyy_WITH_SLASH", "M/d/yyyy");
mapOfConstants.put("dd_mm_yyyy_WITH_SLASH", "dd/MM/yyyy");
mapOfConstants.put("dd_MMM", "ddMMM");
mapOfConstants.put("dd_MM_yy", "ddMMyy");
mapOfConstants.put("dd_MMM_yyyy", "ddMMMyyyy");
mapOfConstants.put("dd_MM_yyyy_COMBINED", "ddMMyyyy");
mapOfConstants.put("dd_MM_yyyy_HH_mm_ss", "yyyy-MM-dd'T'HH:mm:ss");
mapOfConstants.put("dd_MM_yyyy_HH_mm_ss_sz", "yyyy-MM-dd'T'HH:mm:ss.SSS");
mapOfConstants.put("dd_MM_yyyy_HH_mm_ss_sz_XXX", "yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
mapOfConstants.put("dd_MM_yyyy_HH_mm", "dd-MM-yyyy HH:mm");
mapOfConstants.put("HH_mm", "HH:mm");
mapOfConstants.put("YYYY_MM_DDTHH_mm_ssZ", "YYYY-MM-DD'T'HH:mm:ssZ");
// observe this line
unmodifiableMap = Collections.unmodifiableMap(mapOfConstants);
}
}
Now you can use it in another class like :
public class Test {
public static void main(String[] args) {
Constant.unmodifiableMap.get("dd_MM_yyyy_COMBINED");
// this wouldn't execute
Constant.unmodifiableMap.put("asd", "asdad");
}
}
You won't be able to use an enum either as it would ask you to define the constants as per your question.
is there a possibility to activate autocomplete for constants with underscores _?
I have a class with many constants, where many of them begin same. Example:
// Component details
public static final String PROPERTY_NAME_COMPONENT_MATERIAL_NUMBER = "name";
public static final String PROPERTY_NAME_COMPONENT_OVERALL_WORK_STATUS = "componentOverallWorkStatus";
public static final String PROPERTY_NAME_COMPONENT_RELEASE_STATUS = "freigabestatus";
public static final String PROPERTY_NAME_COMPONENT_DESCRIPTION = "label";
public static final String PROPERTY_NAME_COMPONENT_AMOUNT = "newAmount";
public static final String PROPERTY_NAME_COMPONENT_BASE_QUANTITY_UNIT = "basismengeneinheit";
public static final String PROPERTY_NAME_COMPONENT_PRODUCER = "hersteller";
public static final String PROPERTY_NAME_COMPONENT_PRODUCER_FRAGMENT_NUMBER = "herstellerteilenummer";
public static final String PROPERTY_NAME_COMPONENT_EXCLUDE_ALTERNATIVE_ARTICLE = "componentExcludeAlternativeArticle";
public static final String PROPERTY_NAME_COMPONENT_GENERAL_INFO = "componentGeneralInfo";
They all start with PROPERTY_NAME_COMPONENT and if I now begin to type this
System.out.println(ClassWithThoseConstants.P
and press Ctrl + Space. Now I got all constansts starting with P, which is fine. But now I'd like to go further with camelcase style, i.e. PNCP which shall lead to the options:
PROPERTY_NAME_COMPONENT_PRODUCER and PROPERTY_NAME_COMPONENT_PRODUCER_FRAGMENT_NUMBER.
Typing P_N_C_P doesn't help either. Is there a possibility? I couldn't find any.
I have few constant values which I refer across my application. I am creating a class something like below snippet.
public class Styles {
public static final String tableStyle = "TableGrid";
public static final String fontFamily = "Calibri";
public static final String headerStyle = "Heading2";
public static final String footerStyle = "Heading3";
public static final String tableHeaderStyle = "Heading1";
public static final String tableDataFontFamily = "Cambria";
public static final int tableHeaderFontSize = 16;
public static final int tableDataFontSize = 12;
}
I am assigning the values in it and I am referring them like Styles.headerStyle . My doubt is, is this the good way or is there any better approach to achieve this? something like Enum ?
Thanks in advance.
It depends on the nature of your application, in most cases it is not a good practice to have a collection of constants in that way, but it is difficult to tell without knowing the context of your application. BTW, are sure that you'll never (or almost never) change things like "fontFamily"?
Of course an enum would be a little less verbose and more functional:
public enum Styles {
TABLE_STYLE("TableGrid"),
FONT_FAMILY("Calibri"),
HEADER_STYLE("Heading2"),
FOOTER_STYLE("Heading3"),
TABLE_HEADER_STYLE("Heading1"),
TABLE_DATA_FONT_FAMILY("Cambria"),
TABLE_HEADER_FONT_SIZE("16"),
TABLE_DATA_FONT_SIZE("12");
private String value;
private Styles(String value) {
this.value = value;
}
public String getStringValue() {
return value;
}
public int getIntValue() {
return Integer.valueOf(value);
}
}
1) You can use an external file as a Property File.
2) You can use an enum as #morgano answer
3) I would change your class declaration to
public final class Styles { // final class can't have childs
private Styles(){} // you cannot instanciate
public static final String tableStyle = "TableGrid";
.
.
.
}
I would know what is the best practice for storing global constants which can change with the environnement (debug, preprod, prod, release, etc) at compile time.
In iOS, I used to keep all global constants in a header file and change it with pre-processor macro see this answer:
Where to store global constants in an iOS application?
What solution should I use for Android ?
Create a class constants in your base package folder. (or create an interface instead of a class so there is no need to reference the class everytime, however this is bad practice due to code readability, but it will work)
Fill it with public static final values.
Moreover, both the class as well as the interface can also be declared as abstract.
If values for your constants depend on environment (density, locale etc.) then you should use resources for storing them (integer, string, dimen etc.).
In another case you can put your global constants in one file (best practices - use prefixes for every set of constants) or put local constants in related classes (for instance, Intent holds flags. extras, categories and so on).
Use public static final values. and keep them in separate java file as follows:
static String QC = "http:/************";
static String DEV = "http:/************";
static String CLOUD = "http:/************";
static String SERVICEURL = CLOUD ; //Use this SERVICEURL in your code at run time
Another solution might be to use the resource file (if you are content with storing only string values).
This could be used to store constants such as the account that this application manages:
Ex. WelcomeActivity.java
AccountManager am = AccountManager.get(WelcomeActivity.this);
Account account = am.getAccountsByType(getResources().getString(R.string.ACCOUNT_TYPE))[0];
Ex. res/values/strings.xml
<resources>
<string name="ACCOUNT_NAME">com.acme.MyAccountSignature</string>
</resources>
This would also allow you to modify this without the need to recompile (similarly to how you would normally decouple translations, which the strings.xml file is best used for).
Pretty simple solutions is here
public class Constants {
/**
* Object key prams when pass the json object from server.
*/
public static final String KEY_EMAIL = "email";
public static final String KEY_PASSWORD = "password";
public static final String KEY_DEVICE_TOKEN = "device_token";
public static final String KEY_DEVICE_TYPE = "device_type";
public static final String KEY_NAME = "name";
public static final String KEY_COUNTRY_CODE = "country_code";
public static final String KEY_PHONE_CODE = "phone-code";
public static final String KEY_GENDER = "gender";
public static final String KEY_DATE_OF_BIRTH = "date_of_birth";
public static final String KEY_USER_ID = "user_id";
public static final String KEY_LIMIT = "limit";
public static final String KEY_DRIVER_ID = "driver_id";
public static final String KEY_LONGTITUDE = "logitude";
public static final String KEY_LATTITUDE = "lattitude";
public static final String KEY_RATING = "rating";
public static final String KEY_DETAILS = "details";
public static final String KEY_ACCESS_TOKEN= "access_token";
/**
* Fragments name
*/
public static final String FRAG_ETA = "ETA";
public static final String FRAG_ACCOUNT_FRAGMENT = "ACCOUNT_FRAGMENT";
public static final String FRAG_SETTING_FRAGMENT = "SETTING_FRAGMENT";
public static final String FRAG_MAP_FRAGMENT = "MAP_FRAGMENT";
public static final String FRAG_FEEDBACK = "FEEDBACK";
public static final String FRAG_RATE_FRAGMENT = "RATE_FRAGMENT";
public static final String USA_CODE = "+1";
public static final String DISTANCE_SEARCH = "DISTANCE_SEARCH";
}
happy coding
Property File
We store a property file under <project>/<package>/src/main/assets/config.properties
Loading properties
private static final String PROPS_NAME = "config.properties";
private static Properties configuration;
...
public static void init(Context ctx) {
configuration = new Properties();
InputStream rawResource = resources.getAssets().open(PROPS_NAME);
configuration.load(rawResource);
this is the issue at hand, when trying to serialize the class below with the code below i'm getting is the below xml file without all the strings in the class.
The Class (some static values have changed but basically it), I left out all the generated get\set but they are all there with public access modifiers.
public class NotificationConfiguration implements Serializable
{
public static final String PORT_KEY = "mail.smtp.port";
public static final String DEFAULT_PORT_VALUE = "587";
public static final String TTL_KEY = "mail.smtp.starttls.enable";
public static final String DEFAULT_TTL_VALUE = "true";
public static final String AUTH_KEY = "mail.smtp.auth";
public static final String DEFAULT_AUTH_VALUE = "true";
public static final String MAIL_SERVER_KEY = "mail.smtp.host";
public static final String DEFAULT_MAIL_CLIENT_HOST = "smtp.gmail.com";
public static final String DEFAULT_MAIL_CLIENT_USERNAME = "*********";
public static final String DEFAULT_MAIL_CLIENT_PASSWORD = "*********";
public static final String DEFAULT_MAIL_CLIENT_ADDRESS = "*********";
public static final String DEFAULT_ADMIN_EMAIL = "*********";
public static final long DEFAULT_MAIL_INTERVAL = 24*60*60*1000; //One time a day default
public static final String SAVED_FOLDER_NAME = "C:\\Library";
public static final String SAVED_FILE_NAME = "C:\\Library\\NotificationCfg.xml";
private String portValue = DEFAULT_PORT_VALUE;
private String ttlValue = DEFAULT_TTL_VALUE;
private String authValue = DEFAULT_AUTH_VALUE;
private String mailClientHost = DEFAULT_MAIL_CLIENT_HOST;
private String mailClientUserName = DEFAULT_MAIL_CLIENT_USERNAME;
private String mailClientPassword = DEFAULT_MAIL_CLIENT_PASSWORD;
private String mailClientAddress = DEFAULT_MAIL_CLIENT_ADDRESS;
private String adminEMail = DEFAULT_ADMIN_EMAIL;
private boolean overdueSubsNotificationEnabled = false;
private boolean adminReportNotificationEnabled = false;
private long mailInterval =
}
The code used to serialize, which also creates the folder if missing.
public void storeChanges()
{
try
{
try
{
File f = new File(NotificationConfiguration.SAVED_FOLDER_NAME);
f.mkdir();
}
catch (Exception e){}
XMLEncoder encoder = new XMLEncoder( new BufferedOutputStream(new FileOutputStream(NotificationConfiguration.SAVED_FILE_NAME)));
encoder.writeObject(notificationConfig);
encoder.close();
System.out.println(LOG_CONFIGURATION_STORED);
}
catch (Exception ex)
{
System.out.println(LOG_CONFIGURATION_NOT_STORED + ex.getMessage());
}
}
The XML file received, with no exceptions thrown while serializing.
It basically just has the long value.
XMLEncoder encodes information about how to restore your object. If field values haven't changed from their defaults, XMLEncoder doesn't store anything.
This can cause confusion.
Hence, my rules of thumb when using XMLEncoder are:
1. don't initialize fields. don't do private String foo = DEFAULT_FOO;
2. don't do anything in the default constructor.
3. have some other method, or factory that will give you a "default" setup if needed.
I highly recommend to read again the XMLEncoder Javadoc
I will point out the main differences with the binary serialization we all know.
to restore the instance it need the class definition available to the JVM
It serializes only the data. And only the modified from default data.
As result of the 2 points above - is that there is no reason to serialize Static final values - they are part of the class definition.
The binary serialization on the other hand does serialize the class definition and can load from byte stream a class that was not available to the JVM before.
That is why you got results that you see. It Ok this is behavior by design and you use it right. It seems just not to be what you need.
By the way see what Xstream has to offer.
What is SAVED_FOLDER_NAME ? Is that like a factory object and did you by any chance call setMailInterval on that object?
Could that be that only mailInterval has a getter?
Just looked again the question apparently there is getter for all fields so ...