这是一个好习惯吗? (课程领域)

时间:2017-10-25 08:10:13

标签: android performance field java-7

我需要定义相对大量的类别(开始时大约30个,我们将添加更多)。请考虑以下代码:

(function () {
  var element = document.getElementById('submitReg'),
      the_form = document.getElementById('the_form'),
      current_time = document.getElementById('current_time'),
      start, end;

  window.onload = function (event) {
    start = +event.timeStamp; 
  };

  element.onclick = function (event) {
    end = +event.timeStamp;

    var diff = end - start; // time difference in milliseconds

    console.log(diff);

    //Allow the form to submit only after 3000 miliseconds
    if(diff > 3000){
      return true; 
    }
    return false;
  };

  //To test if this works...
  the_form.onsubmit = function(event){
    alert('Form submitted!');
  };
})();

我需要声明类别,还需要一种方法来迭代它们。我放弃反思,因为我认为这不是一个很好的做法。

声明同一个类的静态最终字段的大名称,并将它们放在列表中是一个好习惯吗?作为替代方案,我考虑使用public class Category { public static final Category DRESS = new Category("Dress"); public static final Category SKIRT = new Category("Skirt"); ... private static final List<Category> CATEGORIES = Arrays.aslist(DRESS, SKIRT, ...); private String name; public Category(String name) { this.name = name; } //Some static public method to iterate over categories ... 而不是列表,并且字段是用于标识每个类别的整数,因此您可以通过将它们放入地图中来获取类别。这在时间和空间性能方面会更好吗?

PS:这是一个Android项目,如果它改变了什么

4 个答案:

答案 0 :(得分:3)

  

考虑以下代码:

public class Category {

    public static final Category DRESS = new Category("Dress");
    public static final Category SKIRT = new Category("Skirt");

是的,这实际上就是enums在后台所做的事情,所以

public enum Category {
    DRESS("Dress"),
    SKIRT("Skirt"),
    ...;

    private String name;

    private Category(String name) {
         this.name = name;
    }

    // Category.values() returns the elements as an array

答案 1 :(得分:2)

您应该使用enum而不是使用new Category("Dress");创建对象,因为创建对象昂贵比使用enum。 Java枚举的实现更像是类,因此您可以无缝地更改代码:

public enum Category {
  DRESS("Dress"), SKIRT("Skirt");

  private final String name;

  Category(String name) { 
    this.name = name; 
  }

  public String getName() { 
    return name; 
  }
}

注意:
枚举类型的构造函数必须是包私有或私有访问。它会自动创建在枚举主体开头定义的常量。你不能自己调用​​枚举构造函数。

Enum Types

了解有关枚举的详情

答案 2 :(得分:1)

我想说使用{{ str.slice }}就足够了。

  

只有在必须查找时才应考虑List   特别是Map通过一些关键属性(如你的情况下的int)。

如果Category课程中没有任何属性或方法,请考虑仅使用Category替换它们。

如果在运行时创建了新的Strings并且您想要保留它们,请考虑使用数据库或文件来保存类别。

  

编辑:回答评论中的问题

这取决于Categories类。如果它的唯一目的是枚举所有类别,并且类本身没有任何其他实例方法或属性,那么就空间复杂度而言,Category和您的Integer类是相似的(因为在{ {1}}整数将在Category类对象中加载

我仍然建议您使用名为Map的类和列表,如果目的只是迭代它们和/或使用应用程序中其他位置的Integer类的特定实例,例如。 Category

以下示例是一个很好的用例

Category

Category.SOME_CATEGORY

后者的问题是你可以传递任何int,它可能是也可能不是类别的有效键。使用类可以进行额外的编译时检查。虽然你总是可以使用someMethod(Category category) { // do something } 。但我再次重申,这一切都归结为someMethod(int category) { // before doing anything // lookup this category by an int key // in the the Map<Integer, Category> } 类是否有任何实例方法或属性。

答案 3 :(得分:0)

对于小型列表,可以使用ListMap

但是对于大型列表,您可能希望将它们存储在数据库中。

同样ArrayList的{​​{1}}比使用String的{​​{1}}

更有效率