小编Fra*_*ris的帖子

使现有Java接口有功能存在危险吗?

通常,在大型项目的上下文中,将现有的,无处不在的接口用于功能接口是否安全?

例如,给定一个现有的接口和类:

public interface Interface {
    public double calculateSomething(double x);
    public void doSomething();
}
Run Code Online (Sandbox Code Playgroud)

由...实施

class InterfaceImplementer implements Interface {

     public double calculateSomething(double x) {
          return 2 * x;
     }

     public void doSomething() {
         // insert specific behavior here
     } 
}
Run Code Online (Sandbox Code Playgroud)

我可以通过定义除一个方法之外的所有方法来安全地更改界面:

public interface Interface {
    public double calculateSomething(double x);

    default void doSomething() {
         // insert some default behavior here
    }
}
Run Code Online (Sandbox Code Playgroud)

这样我就可以将对象定义为

Interface object = new InterfaceImplementer() {

    @Override
    public double calculateSomething(double x) {
        return 2 * x;
    } …
Run Code Online (Sandbox Code Playgroud)

java lambda functional-interface

9
推荐指数
2
解决办法
330
查看次数

“应该以静态方式访问”

我有一个类的名称可能不必要地繁琐,其中包含许多我在其他地方使用的静态方法。

而不是用很多填充我的代码

VeryUnnecessarilyLongCumbersomeName.doThingFoo();
VeryUnnecessarilyLongCumbersomeName.doThingBar();
VeryUnnecessarilyLongCumbersomeName.doThingEgg();
VeryUnnecessarilyLongCumbersomeName.doThingSpam();
Run Code Online (Sandbox Code Playgroud)

我宁愿有

VeryUnnecessarilyLongCumbersomeName thing = new VeryUnnecessarilyLongCumbersomeName();
thing.doThingFoo();
thing.doThingBar();
thing.doThingEgg();
thing.doThingSpam();
Run Code Online (Sandbox Code Playgroud)

但是,这得到了警告

"the static method doThingFoo() should be accessed in a static way."
Run Code Online (Sandbox Code Playgroud)

我知道这里有多种解决方案。使用更好的类名。让它不是静态的。忽略它,因为它只是一个警告。

但我实际上并不认为这应该是一个警告。这样做有什么危害?是否有一种更优雅/正确的方法可以使我的代码不那么笨拙,这不是上述解决方案之一?

注意:我怀疑这可能需要coding-style标记,因此被认为是题外话并被拒绝。然而,我认为这里有这样一个问题的空间,所以我把它留给你们。

java

5
推荐指数
1
解决办法
94
查看次数

Boto:如何将 s3 用作资源或客户端,但不能同时用作两者?

这是我对 Boto 和 AWS 的完整新手介绍。目前我唯一的目标是能够访问外部机构的 S3 存储桶,因此我特别想了解如何使用它们。这个最小的代码完成了我想要它做的事情,但我还没有弄清楚如何通过仅将 s3r 声明为资源并避免使用 s3 作为客户端来使用它。似乎最好从 S3 资源访问存储桶,然后专门使用该存储桶,即bucket.new_key('testdir/')bucket.put_object(Key=('testdir/))。这是可能的,还是有一个很好的理由来重新构建我的处理方式?谢谢!

import boto3

bucket_name = 'my-bucket-name'
region_name = 'my-region-name'

print('Acquiring s3 service')
s3 = boto3.client('s3', region_name=region_name)
s3r = boto3.resource('s3', region_name=region_name)OB

print('Accessing bucket')
bucket = s3r.Bucket(bucket_name)

print('Emptying bucket')
bucket.objects.all().delete()

print('Uploading folder structures')
s3.put_object(Bucket=bucket_name, Key=('testdir/'))
s3.put_object(Bucket=bucket_name, Key=('testdir/subdir1/'))
s3.put_object(Bucket=bucket_name, Key=('testdir/subdir2/'))
Run Code Online (Sandbox Code Playgroud)

amazon-web-services python-3.x boto3

4
推荐指数
1
解决办法
1137
查看次数

Python列表理解具有可变长度的多个元素?

我正在编写代码将CSV转换为XML.假设我有一个列表,如:

input = ['name', 'val', 0, \
         'name', 'val', 1, 'tag', 'val', \
         'name', 'val', 2, 'tag', 'val', 'tag', 'val', \
         'name', 'val', 0]
Run Code Online (Sandbox Code Playgroud)

此列表的每个切片以"name"开头,表示具有名称,值和可变标记值对的可变数量的元素.

我想把它变成:

output = [['name', 'val', []], 
          ['name', 'val', ['tag', 'val']],
          ['name', 'val', ['tag', 'val', 'tag', 'val']],
          ['name', 'val', []]]
Run Code Online (Sandbox Code Playgroud)

无需将标记值对分隔为元组,这是在单独的方法中处理的.我有一个解决方案,但它不是非常pythonic:

output=[]
cursor=0

while cursor < len(input):
    name=input[cursor]
    val=input[cursor+1]
    ntags=int(input[cursor+2])
    optslice=input[cursor+3:cursor+3+2*ntags]
    cursor = cursor+3+2*ntags
    print name, val, ntags, optslice, cursor
    output.append([name, val, optslice])    
print output

> name val 0 [] 3
> name val 1 ['tag', …
Run Code Online (Sandbox Code Playgroud)

python list-comprehension python-2.7

2
推荐指数
1
解决办法
624
查看次数