【问题标题】:How to store separate constant class for constant variables in Android developmentAndroid开发中如何为常量变量存储单独的常量类
【发布时间】:2014-10-17 09:03:47
【问题描述】:

我在 Android 应用中有常量变量,如下所示。我想将它们移到一个单独的常量类中,这样会更干净。你有什么建议?我在项目中创建什么样的文件,我是否只需在 MainActivity 类中导入该常量类?我正在寻找的是类似于 C++ 中的 constants.h 文件。你们有什么建议?

public class MainActivity extends ActionBarActivity {


public static final String NET_SALE = "com.domain.mobile.tipcalculator.MESSAGE1";
public static final String SER_CHRG = "com.domain.mobile.tipcalculator.MESSAGE2";
public static final String TRN_IN = "com.domain.mobile.tipcalculator.MESSAGE3";
public static final String TRN_OUT = "com.domain.mobile.tipcalculator.MESSAGE4";
public static final String POOL = "com.domain.mobile.tipcalculator.MESSAGE5";
public static final String RADIO = "com.domain.mobile.tipcalculator.MESSAGE6";

【问题讨论】:

  • 不公开,将它们设置为protected。然后在您的代码(甚至是其他活动或类)中的任何地方调用它们,例如 MainActivity.NET_SALE 您可能想要创建一个单独的 Java 类,而不是使用 MainActivity。
  • 我的建议,为每个项目创建一个常量文件,并将项目相关的常量粘贴到这个文件中。

标签: java android variables constants


【解决方案1】:

您可以将它们存储在一个包含 public static final 变量的类的文件中,并使用 import static com.example.Constants.* 访问它们。

不过,我建议将呈现给用户的任何内容都存储在 strings.xml 中,以便翻译。

【讨论】:

  • 这些变量不会呈现给用户。它们将用于计算。所以我创建了另一个名为 Constants.java 的类,下面是它的内容。 package com.domain.mobile.tipcalculator.app; public class Constants { public static final String NET_SALE = "com.domain.mobile.tipcalculator.MESSAGE1"; public static final String SER_CHRG = "com.domain.mobile.tipcalculator.MESSAGE2"; ... 这就是我导入它的方式,但它不起作用。 import com.domain.mobile.tipcalculator.app.Constants; Main Activity 类中的错误消息是“找不到符号变量”。
  • @fcukinyahoo 请重新阅读我的答案,您需要包含“静态”,并且需要“.*”部分。
  • 工作了,谢谢。我有两个问题要学得更好。 1. 为什么需要静态。 2. 为什么 * in Constants.* 需要?谢谢
  • 你看到我之前的评论了吗?
  • @fcukinyahoo 这应该说明一切:en.wikipedia.org/wiki/Static_import
【解决方案2】:

常见的解决方案是创建一个类Constants,您可以在其中放置常量,使其成为public static final。您还应该使这个类不可实例化,因为实例化它才有意义。所以你可以把它的构造函数设为private。

另一种常用的解决方案是创建一个您的类可以实现的接口。 像这样 - interface Constants 和你的班级 - mainActivity implements Constants。通常它被认为不是很好的解决方案,因为接口通常用于显示类行为。您可以参考Effective Java 的更多信息 - 第 19 项。

【讨论】:

    【解决方案3】:

    我的问题是:这些常量在哪里使用?如果它们只在 MainActivity 中使用,那么它们应该保留在那里。如果它们在多个位置使用(看起来不像——它们是 Intent extras 的键吗?)那么你应该看看有一些具有这些值的基类是否有意义(protected ) 并从该类继承以将它们传递下去。

    如果您只是使用这些来提供附加功能并且不想将它们公开,您可以使用静态工厂方法创建一个新的 Intent 来启动 Activity,在内部提供附加功能,并让这些常量private:

    public static Intent newIntent(Context ctx, String netSale, String serChrg, String trnIn,
                                   String trnOut, String pool, String radio) {
        Intent intent = new Intent(ctx, MainActivity.class);
        intent.putExtra(NET_SALE, netSale);
        intent.putExtra(SER_CHRG, serChrg);
        intent.putExtra(TRN_IN, trnIn);
        intent.putExtra(TRN_OUT, trnOut);
        intent.putExtra(POOL, pool);
        intent.putExtra(RADIO, radio);
        return intent;
    }
    

    【讨论】:

      【解决方案4】:

      或者我会建议枚举:

      public enum Message{
      
        NET_SALE("com.domain.mobile.tipcalculator.MESSAGE1"),
        SER_CHRG("com.domain.mobile.tipcalculator.MESSAGE2"),
        TR_IN("com.domain.mobile.tipcalculator.MESSAGE3"),
        TR_OUT("com.domain.mobile.tipcalculator.MESSAGE4"),
        POOL("com.domain.mobile.tipcalculator.MESSAGE5"),
        RADIO("com.domain.mobile.tipcalculator.MESSAGE");
      }
      

      【讨论】:

        【解决方案5】:
        java中的

        常量一般被声明为public、static和final。 因此,我们将在 final 类中定义所有常量,如下所示:

        public final class AppConstants {
        
        public static final String EMAIL = "email";
        public static final String ADDRESS = "address";
        public static final String NAME = "name";
        
         // inner class
         public final class LANGUAGE {
            public static final String ENGLISH = "en";
            public static final String ARABIC = "ar";
        
            private LANGUAGE() {
            }
        }
        
        // private constructor to block initialisation
        private AppConstants() {}
        
        }
        

        访问常量值,例如:

        • AppConstants.ADDRESS, // 直接来自 Appconstants 类
        • AppConstants.EMAIL,
        • AppConstants.LANGUAGE.ENGLISH, // 来自 Appconstants 的内部类 Language
        • AppConstants.LANGUAGE.ARABIC.

        希望它对某人有所帮助!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-10-20
          • 1970-01-01
          • 1970-01-01
          • 2013-04-06
          • 1970-01-01
          • 2014-01-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多