java 使用静态导入比使用导入有什么优势吗?[副本]

mzaanser  于 2023-05-27  发布在  Java
关注(0)|答案(8)|浏览(109)

此问题已在此处有答案

What is a good use case for static import of methods?(16个回答)
4年前关闭。
考虑下面的类

public final class Constant {
  public static final String USER_NAME="user1";
  //more constant here
}

包B中的此类。
现在我将在包A中使用它。考虑以下两种可以使用的方法。
方法1-使用import B.Constant

import B.Constant;

public class ValidateUser {
public static void main(String[] args) {
   if(Constant.USER_NAME.equals("user1")){

   }
  }
 }

方法2-使用import static B.Constant.USER_NAME;

import static B.Constant.USER_NAME;

public class ValidateUser {
public static void main(String[] args) {
   if(USER_NAME.equals("user1")){

   }
 }
}

我的问题是,在这种情况下,正常导入与静态导入相比有什么区别或优势吗?

4bbkushb

4bbkushb1#

普通importimport static之间的唯一区别是,后者用于将其他类或接口的static成员- * 特别是 * 常量-移动到作用域中。用不用由你决定我喜欢它,因为它保持类的身体较短,但YMMV。
使用它们不会带来性能上的好处或损失(除非是在编译时,好像您很关心这一点),因为它们编译成相同的字节码。

pu3pd22g

pu3pd22g2#

主要区别是可读性Constant.USER_NAMEUSER_NAME相比可读性较差。
Documentation
如果使用得当,静态导入可以通过删除类名重复的样板文件,使程序更具可读性。
但无论如何,尽量避免做
import static B.Constant.*;
因为它可能会用您导入的所有静态成员污染其命名空间。

ttvkxqim

ttvkxqim3#

我很少使用静态导入,只有在它们实际上使代码更容易理解的情况下才使用。
Oracle表示:
http://docs.oracle.com/javase/1.5.0/docs/guide/language/static-import.html
那么什么时候应该使用静态导入呢?非常谨慎!只有当您试图声明常量的本地副本或滥用继承时才使用它(常量接口反模式)。换句话说,当您需要频繁访问一个或两个类中的静态成员时,请使用它。如果您过度使用静态导入特性,它会使您的程序不可读且不可维护,并使您导入的所有静态成员污染其命名空间。你的代码的读者(包括你,在你写了代码几个月后)将不知道静态成员来自哪个类。从一个类中导入所有的静态成员对可读性特别有害;如果只需要一个或两个成员,请分别导入它们。如果使用得当,静态导入可以通过删除类名重复的样板文件,使程序更具可读性。
这里要注意的要点:

  • 当您需要频繁访问一个或两个类中的静态成员时,请使用它
  • 如果使用得当,静态导入可以使程序更具可读性

评论者@Donal Fellows恰当地说,使用IDE来管理静态导入的风险较小。我同意现代IDE已经走过了很长的路,并且将消除很多管理依赖关系和跟踪方法调用到父对象的痛苦。

qcuzuvrc

qcuzuvrc4#

例如,Math类中的所有方法都是静态的,我们将它们都称为Math.mathod()。但是如果我们像这样导入math类:import static java.lang.Math.*;我们不必在方法前添加Math:

import static java.lang.Math.*;

public class Program {

    public static void main(String args[]) {

        System.out.println(sqrt(25));
        System.out.println(log(100));
        System.out.println(PI);
    }
}
goqiplq2

goqiplq25#

静态导入可以避免使用类名限定静态成员。

一旦导入了静态成员,就可以在代码中使用它,而不需要类名前缀。
很好的例子:

import static sample.SampleStaticValues.NUM_ZERO;
…

enum OddEven {odd,even}

//need not do SampleConstants.NUM_ZERO due to static import feature
if(num % 2 == NUM_ZERO){
   System.out.println("The num " + num + " is: " + OddEven.even);
}

  package sample;
  public class SampleStaticValues {
  public static int NUM_ZERO = 0;
  public static int NUM_ONE = 0;
}
mnemlml8

mnemlml86#

静态导入用于保存您的时间和输入。如果你讨厌一遍又一遍地输入同样的东西,那么你可能会发现这样的导入很有趣。
import允许java程序员访问一个包的类,而不需要包限定。

静态导入**特性允许访问类的静态成员,而无需类限定。
让我们通过下面的例子来理解这一点:
示例1:无静态导入

class Demo1{
   public static void main(String args[])
   {
      double var1= Math.sqrt(5.0);
      double var2= Math.tan(30);
      System.out.println("Square of 5 is:"+ var1);
      System.out.println("Tan of 30 is:"+ var2);
   }
}

输出:

Square of 5 is:2.23606797749979
Tan of 30 is:-6.405331196646276

示例2:使用静态导入

import static java.lang.System.out;
import static java.lang.Math.*;
class Demo2{
   public static void main(String args[])
   {
      //instead of Math.sqrt need to use only sqrt
      double var1= sqrt(5.0);
      //instead of Math.tan need to use only tan
      double var2= tan(30);
      //need not to use System in both the below statements
      out.println("Square of 5 is:"+var1);
      out.println("Tan of 30 is:"+var2);
   }
}

输出:

Square of 5 is:2.23606797749979
Tan of 30 is:-6.405331196646276
pokxtpni

pokxtpni7#

**各位,今天我们遇到了静态导入的一个很大的缺点。下面分享一下吧~~~

  1. XXXConsts.java具有EVENT_ID(EVENT_ID =“EVENT_ID”),该EVENT_ID被静态导入到从www.example.com扩展的类XXXComceteImpl.javaAbstractService.java
    1.从XXXZeloImpl.java扩展的AbstractService.java需要EVENT_ID =“eventId”。所以EVENT_ID =“eventId”在AbstractService.java中声明。
    1.现在#1被破坏,因为www.example.com中的EVENT_ID引用XXXComceteImpl.java了www.example.com中的EVENT_IDAbstractService.java
    1.可能是EVENT_ID =“eventId”的命名应该不同。
    1.注意:-类的名称是编辑版本,所以看起来不寻常。
nqwrtyyt

nqwrtyyt8#

为了访问静态成员,必须用引用所来自的类来限定引用。例如,必须说:

double r = Math.cos(Math.PI * theta);
or
System.out.println("Blah blah blah");

您可能希望避免不必要地使用静态类成员(如Math.com)。和系统。为此,请使用静态导入。例如,当使用静态导入更改上述代码时,将其更改为:

import static java.lang.System.out;
import static java.lang.Math.PI;
import static java.lang.Math.cos;
...
double r = cos(PI * theta);
out.println("Blah blah blah");
...

那么使用上述技术的好处是什么呢?我看到的唯一优点是代码的可读性。而不是写静态类的名称,可以直接写方法或成员变量的名称。这里也要记住一件事。不允许不明确的静态导入。也就是说,如果你已经导入了java.lang.Math.PI,而你想导入mypackage.Someclass.PI,编译器会抛出一个错误。因此,只能导入一个成员PI。

相关问题